繁体   English   中英

c#Delegate.BeginInvoke()和线程ID

[英]c# Delegate.BeginInvoke() and thread ID

假设我们有一些像这样的简单代码:

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

不, Delegate.BeginInvoke使用线程池。 总是。 除非您想将任务添加到UI消息队列中,否则没有“在空闲时在调用者的线程中执行”的概念...您是否与Control.BeginInvoke / Dispatcher.BeginInvoke混淆了?

在这种情况下,您有一个控制台应用程序-没有消息泵开始。

@ taras.roshko:这是增进您对ThreadPool理解的资源: 关于线程的章节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM