我想使用线程取消阻止ui。
你能告诉我这段代码有什么区别:
private async void button1_Click(object sender, EventArgs e)
{
int result = await Calculate(1, 2);
label1.Text = result.ToString();
}
private async Task<int> Calculate(int number1, int number2)
{
return await Task.Run(() =>
{
Thread.Sleep(5000);
return number1 + number2;
});
}
这段代码:
private async void button1_Click(object sender, EventArgs e)
{
int result = await Calculate(1, 2);
label1.Text = result.ToString();
}
private async Task<int> Calculate(int number1, int number2)
{
await Task.Delay(5000);
return number1 + number2;
}
答案 0 :(得分:2)
主要区别在于Task.Run
创建了一个新线程(请参阅this MSDN documentation的主题部分)。
因此,新线程在第一种情况下创建了5秒的块,然后返回结果(同时,主线程可供使用,因此await将控件从Task.Run(...)
返回给调用者)
在第二种情况下,在await之后,控制权被转移到调用者,并且Task.Delay在主线程中继续进行。没有创建新线程。
正如您在问题中提到的,如果您想要进行多线程,使用Task.Run()
以及async
和await
将为您提供多种可能性。
有关async
和await
控制流程的详细信息,请参阅上述文档。它是一个非常有用和详细的MSDN阅读!