C# 任务的执行顺序
乔恩·斯基特说 输出显示在任务失败之前已获取任务。异常已被抛出 在写入输出之前同步,因为不存在等待表达式 验证前 是否可以保证异常已被抛出 在写入输出之前同步 为什么不能首先写出输出文本(从任务中提取)C# 任务的执行顺序,c#,async-await,C#,Async Await,乔恩·斯基特说 输出显示在任务失败之前已获取任务。异常已被抛出 在写入输出之前同步,因为不存在等待表达式 验证前 是否可以保证异常已被抛出 在写入输出之前同步 为什么不能首先写出输出文本(从任务中提取) async Task Main() { Task<int> task = ComputeLengthAsync(null); Console.WriteLine("Fetched the task"); int length = await
async Task Main()
{
Task<int> task = ComputeLengthAsync(null);
Console.WriteLine("Fetched the task");
int length = await task;
Console.WriteLine("Length: {0}", length);
}
static async Task<int> ComputeLengthAsync(string text)
{
if (text == null)
{
throw new ArgumentNullException("text");
}
await Task.Delay(5000);
return text.Length;
}
async Task Main()
{
任务任务=ComputeLengthAsync(空);
Console.WriteLine(“获取任务”);
int length=等待任务;
WriteLine(“长度:{0}”,长度);
}
静态异步任务ComputeLengthAsync(字符串文本)
{
if(text==null)
{
抛出新的ArgumentNullException(“文本”);
}
等待任务。延迟(5000);
返回文本长度;
}
是否可以保证在写入输出之前已同步抛出异常
是的。事实上,如果方法中根本没有wait
,那么编译器将警告您整个方法将同步运行
为什么不能首先写出输出文本(从任务中提取)
async Task Main()
{
Task<int> task = ComputeLengthAsync(null);
Console.WriteLine("Fetched the task");
int length = await task;
Console.WriteLine("Length: {0}", length);
}
static async Task<int> ComputeLengthAsync(string text)
{
if (text == null)
{
throw new ArgumentNullException("text");
}
await Task.Delay(5000);
return text.Length;
}
输出被写出。异常不会直接抛出;由于它是在
async
方法中抛出的,因此会捕获异常并将其放置在返回的任务上。然后当等待任务时代码>行运行时,wait
从任务中检索异常并(重新)抛出它。看看这个答案:请链接到更广泛的上下文