任务并取消阻止用户界面

mic*_*ael 5 c#

我想用线程取消阻止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;
    });
}
Run Code Online (Sandbox Code Playgroud)

这段代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

Van*_*esh 2

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

在第二种情况下,等待之后,控制权转移给调用者,并且 Task.Delay 正在主线程中进行。没有创建新线程。

正如您在问题中提到的,如果您想使用多线程,那么使用和Task.Run()会给您带来多种可能性。asyncawait

有关控制流的更多详细信息asyncawait请参阅上述文档。这是一本非常有帮助且详细的 MSDN 读物!