【发布时间】:2020-12-17 01:14:25
【问题描述】:
当我阅读有关 async 和 await 工作的 Microsoft 文档时,我不明白
异步方法旨在成为非阻塞操作。一个等待 异步方法中的表达式不会阻塞当前线程,而 等待的任务正在运行。相反,该表达式签署了其余部分 方法的延续并将控制权返回给调用者 异步方法。
所以考虑一下我的代码:
public Form1()
{
InitializeComponent();
AsyncTest();
Test(1);
}
private async void AsyncTest()
{
HttpClient client = new HttpClient();
var ss = TT(2);
var s = await ss;
for (int i = 0; i < 10; i++)
{
//loop
}
}
private async Task<int> TT(int i)
{
while (true)
{
if (i > 1000000000)
break;
i++;
}
return i;
}
}
当我调用 AsyncTest() 时,它只是在 TT 方法后面等待,因为它使用 await 键 指定,但这意味着什么它将控制权返回给主调用者 ?? 它不会返回到 form1,如果 TT 是一个无限循环,它就会永远保持下去。 谢谢
【问题讨论】:
-
编译此代码时,您会收到一个编译器警告,指出
TT不包含await运算符,它将同步运行。我建议您根据该警告进行研究,这样会更清楚发生了什么 -
您的 for 循环是 CPU 密集型的,不是异步 I/O 的良好替代品。
标签: c# winforms async-await