[英]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.