在阅读了使用 Async 和 Await 进行异步编程 (C# 和 Visual Basic)后,我期望我的 GUI 不会挂起。
public async Task<string> DoBusyJob()
{
// Busy Job
Thread.Sleep(10000);
i++;
return "Finished " + i;
}
int i = 0;
private async void button1_Click(object sender, EventArgs e)
{
// Hang!
string result = await DoBusyJob();
this.label1.Text = result;
}
但是实际情况并非如此。它仍然卡住了。 我意识到我需要在 DoBusyJob
中添加额外的await
。
public async Task<string> DoBusyJob()
{
// Busy Job
await Thread.Sleep(10000);
i++;
return "Finished " + i;
}
int i = 0;
private async void button1_Click(object sender, EventArgs e)
{
// OK!
string result = await DoBusyJob();
this.label1.Text = result;
}
请问为什么要这样做?我真的需要使用两个await
吗?如果出现以下情况会怎样?
public async Task<string> DoBusyJob()
{
// How to prevent Hang?
for (int j = 0; j < 10000000; j++) {
double m = Math.Sqrt(1) + Math.Sqrt(2) + Math.Sqrt(3);
}
i++;
return "Finished " + i;
}
int i = 0;
private async void button1_Click(object sender, EventArgs e)
{
// Hang!
string result = await DoBusyJob();
this.label1.Text = result;
}
await Task.Run( () => DoExpensiveCpuCalculations());
。 - cordialgerm