任务并取消阻止用户界面

本文关键字:用户界面 取消 任务 | 更新日期: 2023-09-27 18:33:21

我想使用线程取消阻止 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;
}

任务并取消阻止用户界面

主要区别在于Task.Run创建一个新线程(请参阅此 MSDN 文档的线程部分)。
因此,新线程在第一种情况下创建了块 5 秒,然后返回结果(同时,主线程可供使用,因此 await 将控件从 Task.Run(...) 返回给调用方)

第二种情况下,在等待之后,控制权被转移到调用方,并且 Task.Delay 在主线程中进行。不会创建新线程。

因此,正如您在问题中提到的,如果您想进行多线程,将Task.Run()asyncawait一起使用将为您提供多种可能性。

有关asyncawait控制流的更多详细信息,请参阅上述文档。这是一个非常有用和详细的MSDN阅读!