.结果操作不会阻塞

Hax*_*Hax 1 c# blocking task-parallel-library

我预计下面的代码会被阻塞近 5 秒,但事实并非如此。它立即打印出来。Result操作不是阻塞的吗?

class Program
{
    static void Main()
    {
        // Return a value type with a lambda expression
        Task<int> task1 = Task<int>.Factory.StartNew(() => Task.Delay(5000).Id + 100);
        int i = task1.Result;
        Console.WriteLine(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*erg 5

此代码不等待Delay完成。它开始延迟,然后立即返回Id+100。因此,当代码到达Result操作时,task1is 几乎总是处于Completed状态,因此您Result可以立即得到。

您可以尝试以下操作以获得所需的行为

Task<int> task1 = Task.Run(async () => await Task.Delay(5000).Id + 100);
int i = task1.Result;
Run Code Online (Sandbox Code Playgroud)

或者更好的是,使用await而不是Result到处使用

Task<int> task1 = Task.Run(async () => await Task.Delay(5000).Id + 100);
int i = await task1;
Run Code Online (Sandbox Code Playgroud)

甚至

int i = await Task.Delay(5000).Id + 100
Run Code Online (Sandbox Code Playgroud)

(但我在这里不确定,因为实际代码中的任务内部可能有更多逻辑)

  • 嗯。是的,你是对的 - `StartNew` 不适用于异步,只有 `Task.Run` 可以。我更正了答案。谢谢你! (2认同)