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
从任务中检索异常并(重新)抛出它。

看看这个答案:请链接到更广泛的上下文