Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否应该加上一个“;异步;要一个简短的方法还是不?_C#_.net_Asynchronous_Async Await - Fatal编程技术网

C# 我是否应该加上一个“;异步;要一个简短的方法还是不?

C# 我是否应该加上一个“;异步;要一个简短的方法还是不?,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,技术上有更好的解释,但对于初学者来说,经验法则应该是: 在以下情况下使用异步 库为您提供了一个异步选项,然后通常它会做一些从异步中获益匪浅的事情(HttpClient、StreamReader等) 如果因为1。必须在某个地方使用异步,然后必须一直使用异步,因为调用异步方法的每个更高级别的方法现在本质上也是异步的 如果1。二,。不要应用,否则不要将方法转换为异步 方法的长度与此无关,实际上方法越小越好,因为它是良好编码实践的标志 async/await的额外成本,即使它几乎覆盖了您的代码,通常也会

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

在以下情况下使用异步

  • 库为您提供了一个异步选项,然后通常它会做一些从异步中获益匪浅的事情(HttpClient、StreamReader等)
  • 如果因为1。必须在某个地方使用异步,然后必须一直使用异步,因为调用异步方法的每个更高级别的方法现在本质上也是异步的
  • 如果1。二,。不要应用,否则不要将方法转换为异步
  • 方法的长度与此无关,实际上方法越小越好,因为它是良好编码实践的标志

    async/await的额外成本,即使它几乎覆盖了您的代码,通常也会被您在遵循规则1时获得的收益所抵消。二,

    现在回答一个问题,如果您可以直接返回任务,那么是否必须使用async修饰方法:


    仅在操作需要时间时使用异步,如HTTP请求。不要根据方法的长度来决定是否使用async。我的经验法则是不要以
    async
    的形式开始编写任何方法。在需要插入
    wait
    时,我将添加
    async
    。但是在您的示例中,您的方法只是
    return-await
    ,我认为您不需要那里的
    await
    (如果方法不是
    async
    )。
    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();
            }
        }
    }
    
    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;
    }