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。”标记。它们都是简短的方法,只有一两行。
他们可以在没有“异步”的情况下等待,因为他们会返回Task
或Task<T>
。
在实际代码中,No.1标签上的调用层可能远远超过2个。所以会有很多“异步”的级联。
我应该在短方法中添加“异步”吗?据我所知,async
和await
;
Especilly No.3 ,它只是一种代理方法。真正的操作方法将阻止是 @ No.1 的HttpClient.GetStringAsync
。
=============================================== ==
在阅读@dustinmoris的第一个答案后,我在HttpClient
课程中找到了以下代码。令我感到困惑的是,没有async
和ConfigureAwait(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;
}
答案 0 :(得分:0)
从技术上讲,有更好的解释,但对于初学者来说,经验法则应该是:
时使用异步
方法的长度与它无关,实际上你的方法越小越好,因为它是良好编码实践的标志。
async / await的额外成本,即使它完全覆盖了您的代码,通常会超过您遵循规则1和2时获得的收益。
现在回答一个问题,如果你必须直接返回任务,你是否必须用async修饰方法: