【发布时间】:2015-12-19 23:41:47
【问题描述】:
我看了很多文章,仍然无法理解这部分。
考虑这段代码:
private async void button1_Click(object sender, EventArgs e)
{
await Dosomething();
}
private async Task<string> Dosomething()
{
await Task.Run((() => "Do Work"));
return "I am done";
}
第一个问题:
当我单击按钮时,它将调用 DoSomething 并等待一个任务,该任务通过调用 Task.Run 从线程池创建一个线程(如果我没记错的话),所有这些都是异步运行的。所以我实现了创建一个线程来完成我的工作但异步执行它?但是考虑到我不需要返回任何结果,我只想完成工作而不返回任何结果,是否真的需要使用 async/await ,如果需要,如何使用?
第二个问题:
当异步运行线程时,它是如何工作的?它是在主 UI 上运行但在单独的线程上运行,还是在单独的线程上运行并且在该方法内是异步的?
【问题讨论】:
-
我对 async/await 还不是很熟悉,但我相信是否使用新线程取决于操作系统的决定 - 即,不能保证在 async/await 上执行新线程。
-
@Tim Nit:如果被告知操作系统将启动一个新线程。任何相关的线程池等都发生在 .NET 本身中。
-
@user2864740 - 感谢您的澄清 :)
-
async/await 永远不会创建新线程 - 否则我们都必须在 awaited 调用之后为所有内容编写线程安全的安全代码,这正是 async await 试图避免的。 awaited 方法本身是否产生一个新线程 async/await 无关,被调用的 awaited 总是运行在调用它的同一个线程上。
-
@markmnl - 但是,任何在这里阅读您的评论的人也应该阅读您和 Matias under his answer 之间的讨论,其中明确指出,等待完成后的 继续 可能在不同的线程上,具体取决于当前的 SynchronizationContext。幸运的是,对于 UI 线程,上下文确实确保返回到该 UI 线程。所以对于 UI,它绝对是一个线程。 [我的意思是,如果做
await,但不要做Task.Run。]
标签: c# multithreading async-await