【发布时间】:2019-06-14 11:40:51
【问题描述】:
我有以下代码
class Program
{
public async Task<bool> StartMyTask()
{
await Foo();
return true;
}
public async Task<bool> Foo()
{
for (int i = 0; i < 1000000; i++)
{
Console.WriteLine("Loop");
}
return true;
}
static void Main(string[] args)
{
Program obj = new Program();
var myTask = obj.StartMyTask();
Console.WriteLine("Before Task Return");
Console.ReadLine();
}
}
根据我的理解,当“await Foo()”被调用时,将创建一个线程来执行“Foo()”方法,并将控制权返回给调用者(Main 方法)。
考虑到这一点,应该在“Foo()”方法完成之前打印“Before Task Return”。但它没有发生,首先“Foo()”方法完成,然后显示“Before Task Return”。
【问题讨论】:
-
你的理解是错误的,没有为
Foo创建线程,并且由于它实际上并没有做任何异步工作,所以它会阻塞直到循环完成。 -
简而言之,那些不做任何真正异步工作的异步方法与非异步工作相同。
-
不,不是您编写代码的方式。正如我所说,您对 async/await 的理解是错误的。这两个关键字都不会创建新线程。由于您实际上在这里没有进行异步工作,因此您的代码的行为与删除 async/await 关键字并同步执行所有操作时完全相同。
-
由于你的 Async 没有等待任何东西,它会同步运行。您应该会在编译器中收到有关此效果的警告。
-
简短版:async != 线程(它们是相关主题,但不一样)
标签: c# multithreading async-await