async等待一个简单的包装器方法

Dis*_*ile 1 .net c# asynchronous task-parallel-library async-await

如果我编写一个只包装异步方法的方法,例如:

public async Task WrapMethodAsync()
{
    using(var smtpClient = new SmtpClient())
    {
        await smtpClient.SendMailAysnc(new MailMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

这与执行以下操作相同:

public Task WrapMethodAsync()
{
    using(var smtpClient = new SmtpClient())
    {
        return smtpClient.SendMailAysnc(new MailMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

或者后者实际上不是异步运行?

i3a*_*non 7

在这种情况下,由于范围的原因,这两种情况极为不同using.

在第一种情况下,您等待(异步)以便SendMailAysnc在处理客户端之前完成操作,而在另一种情况下,您不会在操作仍在运行时丢弃客户端.

在一般情况下,一般行为没有差异.例如:

public async Task Run()
{
    throw new Exception("stored");
    await Task.Delay(-1);
}
Run Code Online (Sandbox Code Playgroud)

VS这个:

public Task Run()
{
    throw new Exception("thrown");
    return Task.Delay(-1);
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于该async方法对整个机制(包括状态机)有轻微的开销,async而非async任务返回方法具有不同的异常语义,因为异常直接抛出而不存储在返回的任务中.