2013-04-11 4 views
3

Прежде всего, позвольте мне сказать, что я начинающий C#. Мой опыт в основном был с базами данных. Я работаю над проектом, где будут частые вызовы на C# -сервер, который затем вызывает различные хранимые процедуры (около 20 или около того) для извлечения данных из базы данных SQL Server. Прямо сейчас, сервер C# был настроен на синхронные вызовы. Хотя вызовы SP быстры и малы, мы все равно хотели бы реализовать пул потоков для обработки большого пула пользователей и одновременных запросов.Реализация пула потоков для вызовов хранимых процедур

Мои вопросы:

  1. Как реализовать пул потоков? Скорее всего, пул потоков начнется около 500, но может расти в зависимости от использования приложения.

  2. Как добавить вызовы SP в пул потоков. Сейчас мой SP вызов выглядит следующим образом:

    int SPCall(string param1, string param2) 
    { 
        string MyConnString = "..."; 
        SqlConnection MyConn = new SqlConnection(MyConnString); 
        MyConn.Open(); 
        SqlCommand SPCommand = new SqlCommand("wh_SP"); 
        SPCommand.Connection = MyConn; 
        SPCommand.Parameters.Add(...) = param1; 
        SPCommand.Parameters.Add(...) = param2; 
    
        SPCommand.CommandType = System.Data.CommandType.StoredProcedure; 
        SPCommand.ExecuteNonQuery(); 
        int outPut = (int)SPCommand.Parameters["@OUTPUT"].Value; 
        return outPut; 
    } 
    
+3

Не свернуть свой собственный пул потоков - использовать [встроенный] (http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx) один. Там есть документация о том, как ставить в очередь рабочие элементы. –

ответ

0

Как уже упоминалось в комментариях, вы должны использовать .NET ThreadPool вместо реализации ваших собственных. Еще лучше, используйте новый .NET Parallel library и выложите каждый из них в задание. У вас будет намного лучший контроль над тем, как ваш параллелизм обрабатывается с относительно небольшим кодом.

public void PerformWork() 
{ 
    // setup your inputs 
    IEnumerable<string> inputs = CreateYourInputList(); 

    // Method signature: Parallel.ForEach(IEnumerable<TSource> source, Action<TSource> body) 
    Parallel.ForEach(inputs, input => 
     { 
      // call your code that issues the stored procedure here 
      this.SPCall(input); 
     } //close lambda expression 
    ); //close method invocation 

    // Keep the console window open in debug mode. 
    Console.WriteLine("Processing complete. Press any key to exit."); 
    Console.ReadKey(); 
} 
Смежные вопросы