我应该在短方法中添加“异步”吗?

时间:2017-04-27 06:21:20

标签: c# .net asynchronous async-await

async void Main()
{
    var cp=new ConentProxy();
    Console.WriteLine(await cp.GetAsync());
    Console.ReadLine();
}

// Define other methods and classes here
public class HttpsContentProvider : IContentProvider
{
    private static HttpClient hc=new HttpClient();

    //**@No.1**
    public async Task<string> GetAsync() {
        return await hc.GetStringAsync("https://www.stackoverflow.com").ConfigureAwait(false);
    }
}

public class DefaultContentProvider : IContentProvider
{
    //**@No.2**
    public async Task<string> GetAsync()
    {
        return await Task.FromResult("Default").ConfigureAwait(false);
    }
}
public interface IContentProvider
{
    Task<string> GetAsync();
}

public class ConentProxy : IContentProvider
{
    public static int conentType = int.Parse(ConfigurationManager.AppSettings["UseHttps"] ?? "0");

    //**@No.3**
    public async Task<string> GetAsync()
    {
        switch (conentType)
        {
            case 0:return await new HttpsContentProvider().GetAsync();
            default:return await new DefaultContentProvider().GetAsync();
        }
    }
}

在上面的代码中,有三个“异步”,前面带有“ @No。”标记。它们都是简短的方法,只有一两行。

他们可以在没有“异步”的情况下等待,因为他们会返回TaskTask<T>

在实际代码中,No.1标签上的调用层可能远远超过2个。所以会有很多“异步”的级联。

我应该在短方法中添加“异步”吗?据我所知,asyncawait;

需要付费

Especilly No.3 ,它只是一种代理方法。真正的操作方法将阻止是 @ No.1 HttpClient.GetStringAsync

=============================================== ==

在阅读@dustinmoris的第一个答案后,我在HttpClient课程中找到了以下代码。令我感到困惑的是,没有asyncConfigureAwait(false),这与HttpClient

的其他方法相同
public Task<byte[]> ReadAsByteArrayAsync()
{
    this.CheckDisposed();
    TaskCompletionSource<byte[]> tcs = new TaskCompletionSource<byte[]>();
    this.LoadIntoBufferAsync().ContinueWithStandard((Action<Task>) (task =>
    {
        if (HttpUtilities.HandleFaultsAndCancelation<byte[]>(task, tcs))
            return;
        tcs.TrySetResult(this.bufferedContent.ToArray());
    }));
    return tcs.Task;
}

1 个答案:

答案 0 :(得分:0)

从技术上讲,有更好的解释,但对于初学者来说,经验法则应该是:

时使用异步
  1. 一个库为你提供了一个异步选项,然后它通常会做一些非常有益于异步(HttpClient,StreamReader等)的东西。
  2. 如果因为1.你必须在某处使用异步,那么你必须一直使用异步,因为调用你的异步方法的每个更高级别的方法现在基本上都是异步的。
  3. 如果1.和2.不适用,请不要将方法变为异步
  4. 方法的长度与它无关,实际上你的方法越小越好,因为它是良好编码实践的标志。

    async / await的额外成本,即使它完全覆盖了您的代码,通常会超过您遵循规则1和2时获得的收益。

    现在回答一个问题,如果你必须直接返回任务,你是否必须用async修饰方法: