[英]Difference between Task.Run(()=> DoWorkAsync()) and new Thread(async()=> DoWorkAsync());
我最近遇到了一些让我很困惑的代码,我一直认为你必须使用线程或异步任务,而不是在它们之间混搭,
public async Task DoWork()
{
Task.Delay(1000);
}
现在我看到这样调用的代码:
public void Main()
{
var thread = new Thread(async () => { await DoWorkAync(); })
{
Priority = ThreadPriority.Highest,
IsBackground = true
};
// Start thread
proccessThread.Start();
}
现在这神奇地似乎在每次运行时都没有创建一个线程,它似乎正在使用ThreadPool
。
现在我正在努力理解的是上述和之间的区别:
public void Main()
{
var task = Task.Run(DoWorkASync);
}
根据我的测试,似乎 C# 线程在传递异步表达式时与运行的标准方法具有不同的功能>
这个构造:
var thread = new Thread(async () => { await DoWorkAync(); });
// Start thread
proccessThread.Start();
调用Thread
构造函数重载接受ThreadStart
委托,并且ThreadStart
委托是() => void
。 所以你有这个:
var thread = new Thread(StuffYourThreadExecutes);
thread.Start();
static async void StuffYourThreadExecutes() {
await DoWorkAsync();
}
因此,您启动新线程并运行代码,直到第一个异步操作开始。 然后线程存在。 在第一个异步操作完成后 - rest 在任何线程任务调度程序提供程序(通常是线程池线程)上执行。 在此过程中发生的任何异常都无法观察到。
例如,如果DoWorkAsync
类似于:
static async Task DoWorkAsync(){
await Task.Delay(1000);
}
然后线程启动并几乎立即退出,没有做任何有用的事情。
Task.Run
,在那里传递异步委托时,执行文档中所述的操作:
将指定的工作排入队列以在线程池上运行并返回任务的代理
所以整个操作只是在线程池线程上运行,而不是白白创建线程。 您可以通过等待Task.Run
返回的任务来观察异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.