c # Delegate.BeginInvoke () и идентификатор потока - PullRequest
1 голос
/ 05 апреля 2011

скажем, у нас есть простой код, подобный этому:

private static void Main()
{
    Console.WriteLine("Main thread {0}\n", Thread.CurrentThread.ManagedThreadId);

    Action asyncCaller1 = () => LongPerfomingTask(5);
    Action asyncCaller2 = () => LongPerfomingTask(3);

    var asyncResult1 = asyncCaller1.BeginInvoke(null, null);
    var asyncResult2 = asyncCaller2.BeginInvoke(null, null);

    asyncResult1.AsyncWaitHandle.WaitOne();
    asyncResult2.AsyncWaitHandle.WaitOne();

    Console.WriteLine("Done");
}

private static void LongPerfomringTask(int seconds)
{
    Thread.Sleep(TimeSpan.FromSeconds(seconds));

    Console.WriteLine("Thread {0} finished execution", Thread.CurrentThread.ManagedThreadId);
}

Delegate.BeginInvoke () не создает поток, он выполняет код в потоке вызывающего, когда он находится в состоянии ожидания, верно?почему вывод этого примера приложения выглядит так:

Main thread 1

Thread 4 finished execution
Thread 3 finished execution
Done

Ответы [ 2 ]

6 голосов
/ 05 апреля 2011

Нет, Delegate.BeginInvoke использует пул потоков.Всегда.Нет концепции «выполнения в потоке вызывающего абонента, когда он бездействует», если только вы не думаете о добавлении задач в очередь сообщений пользовательского интерфейса ... вас не смущает Control.BeginInvoke / Dispatcher.BeginInvoke?

в этом случае у вас есть консольное приложение - с этого момента не начинается прокачка сообщений.

0 голосов
/ 06 апреля 2011

@taras.roshko: Вот ресурс, который поможет вам лучше понять ThreadPool: Глава о потоке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...