如何隐式转换任务<a> to A using async and await?</a>

时间:2014-09-23 16:14:54

标签: c# .net task-parallel-library async-await

我只是测试一些异步并等待简单的函数。现在Console.WriteLine(foo())的输出为System.Threading.Tasks.Task1[System.Int32]。我想知道如何让它返回1

static async Task<int> Delay1() { await Task.Delay(1000); return 1; }
static async Task<int> Delay2() { await Task.Delay(2000); return 2; }
static async Task<int> Delay3() { await Task.Delay(3000); return 3; }
static async Task<int> foo()
{ 
    Task<int> winningTask = await Task.WhenAny(Delay1(), Delay2(), Delay3());
    //int r = winningTask.Result;
    //return r;
    await winningTask;
    return winningTask.Result;

}

static void Main(string[] args)
{           
    Console.WriteLine("Done");
    Console.WriteLine(foo()); // 1
    Console.WriteLine(Delay1().Result);
}

1 个答案:

答案 0 :(得分:4)

您似乎对async-await的使用存在一些误解。 await不仅 a 同步等待以完成任务,它还会提取任务的结果并抛出第一个异常(如果有)

static async Task<int> foo()
{ 
    Task<int> winningTask = await Task.WhenAny(Delay1(), Delay2(), Delay3());
    return await winningTask;
}

只要您的方法可以是async,您就应该使用await

static async Task Test()
{           
    Console.WriteLine("Done");
    Console.WriteLine(await foo());
    Console.WriteLine(await Delay1());
}

static void Main()
{           
    Test().Wait();
}