任务和解除用户界面的阻塞

5
我希望您能够使用线程解除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;
}

可能是Thread.Sleep vs Task.Delay?的重复问题。 - Hossain Muctadir
1个回答

2
主要区别在于Task.Run创建一个新线程(请参阅此MSDN文档的“Threads”部分)。因此,在第一种情况下,新线程会阻塞5秒钟,然后返回结果(同时,主线程可用,所以await将控制权从Task.Run(...)返回给调用者)。
在第二种情况下,await之后,控制权被转移回调用者,而Task.Delay在主线程中继续执行。不会创建新线程。
因此,正如您在问题中提到的,如果您想进行多线程处理,则使用Task.Run()asyncawait将为您提供许多可能性。
有关asyncawait控制流的更多详细信息,请参阅上述提到的文档。这是一篇非常有帮助和详细的MSDN阅读!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接