我有这个简单的代码:
public static async Task<int> SumTwoOperationsAsync()
{
var firstTask = GetOperationOneAsync();
var secondTask = GetOperationTwoAsync();
return await firstTask + await secondTask;
}
private async Task<int> GetOperationOneAsync()
{
await Task.Delay(500); // Just to simulate an operation taking time
return 10;
}
private async Task<int> GetOperationTwoAsync()
{
await Task.Delay(100); // Just to simulate an operation taking time
return 5;
}
Run Code Online (Sandbox Code Playgroud)
大.这个编译.
但是让我们说我有一个控制台应用程序,我想运行上面的代码(调用SumTwoOperationsAsync())
static void Main(string[] args)
{
SumTwoOperationsAsync();
}
Run Code Online (Sandbox Code Playgroud)
但我读过,(使用时sync),我不得不一路同步向上和向下 :
问题:这是否意味着我的Main功能应该标记为 …
所以我一直在挖掘HttpClient.SendAsyncvia Reflector 的实现.我有意想知道的是这些方法的执行流程,以及确定调用哪个API来执行异步IO工作.
在探索了里面的各种类之后HttpClient,我看到它在内部使用HttpClientHandler派生自HttpMessageHandler并实现其SendAsync方法的内容.
这是执行HttpClientHandler.SendAsync:
protected internal override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request == null)
{
throw new ArgumentNullException("request", SR.net_http_handler_norequest);
}
this.CheckDisposed();
this.SetOperationStarted();
TaskCompletionSource<HttpResponseMessage> source = new TaskCompletionSource<HttpResponseMessage>();
RequestState state = new RequestState
{
tcs = source,
cancellationToken = cancellationToken,
requestMessage = request
};
try
{
HttpWebRequest request2 = this.CreateAndPrepareWebRequest(request);
state.webRequest = request2;
cancellationToken.Register(onCancel, request2);
if (ExecutionContext.IsFlowSuppressed())
{
IWebProxy proxy = null;
if (this.useProxy)
{ …Run Code Online (Sandbox Code Playgroud)