BeginInvoke: слишком много звонков - PullRequest
0 голосов
/ 11 января 2011


Пожалуйста, посмотрите на следующий кусок кода.

for (int j = 0; j < 500000; j++)  
{  
    Console.WriteLine(j);  

    // Call BeginInvoke with last two parameters as null  

    IAsyncResult asyncRes = dlg.BeginInvoke(j, 4, ref refString, out outString, progressCallBack, null);   
}  

, если вызываемый метод асинхронно спит в течение 5 минут.тогда правильно ли было создать 5 нитей lac?

Спасибо.

1 Ответ

4 голосов
/ 11 января 2011

Как правило, это не так.Когда вы вызываете BeginInvoke для делегата, вы ставите в очередь выполнение асинхронного метода.

.NET Threadpool решит, когда и как выполнить ваш метод, основываясь на очереди работыэлементы, требующие обработки и имеющие максимальную пропускную способность, но, конечно, они не будут работать 500000 потоков параллельно.

Когда я опробовал ваш пример с 5-минутным сном и небольшим консольным сообщением в делегате, изначально работало только 8 потоков, затем медленно добавлялось больше.

Для хорошего объясненияо пуле потоков и асинхронных делегатах читайте эту статью .

...