繁体   English   中英

Task.Run(()=> DoWorkAsync()) 和 new Thread(async()=> DoWorkAsync()); 之间的区别

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

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