C# 如何隐式转换任务<;A>;使用async和Wait创建一个?

C# 如何隐式转换任务<;A>;使用async和Wait创建一个?,c#,.net,task-parallel-library,async-await,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); retu

我只是测试一些异步,并用简单的函数等待。现在,
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);
}
static async Task Delay1(){wait Task.Delay(1000);返回1;}
静态异步任务Delay2(){await Task.Delay(2000);返回2;}
静态异步任务Delay3(){await Task.Delay(3000);返回3;}
静态异步任务foo()
{ 
Task winningTask=等待Task.WhenAny(Delay1(),Delay2(),Delay3());
//int r=winningTask.Result;
//返回r;
等待温宁任务;
返回winningTask.Result;
}
静态void Main(字符串[]参数)
{           
控制台。写入线(“完成”);
Console.WriteLine(foo());//1
Console.WriteLine(Delay1().Result);
}

您似乎对
async wait
的用法有一些误解
wait
不仅异步等待任务完成,它还提取任务的结果,并在有异常时抛出其第一个异常

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

Console.WriteLine(foo().Result)有什么问题?(将在WinForm中死锁,但您有控制台应用程序,所以没问题)。也可以查看博客文章,了解从控制台运行
async
方法的方法。斯蒂芬·克利里(Stephen Cleary)可能重复了这一点-
返回等待winningTask有什么问题?您只需要获得由
foo()
返回的任务结果,请参阅@I3arnon的答案。
static async Task Test()
{           
    Console.WriteLine("Done");
    Console.WriteLine(await foo());
    Console.WriteLine(await Delay1());
}

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