首页 > 解决方案 > 在同一个 HttpWebRequest 中混合使用 Sync 和 Async 方法

问题描述

在他们的文档和示例中,微软表示不要混合对同步和异步方法的调用HttpWebRequesthttps://docs.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest.begingetresponse?redirectedfrom=MSDN&view =net-5.0#remarks )

但是,在给出的示例中,他们调用request.BeginGetRequestStream,并在回调中使用 完成获取流request.EndGetRequestStream,然后用用户输入同步填充它,然后继续使用request.BeginGetResponse

可以直接调用request.GetRequestStream,用另一个流的内容填充它CopyTo,然后继续request.BeginGetResponse吗?

例如,哪个更好:

选项1:

void SendRequest()
{
    // here comes the creation of a request using WebRequest.CreateHttp()
    // ...
   
    request.Method = "POST";
    request.BeginGetRequestStream(GetRequestStreamCallback, request);
}

private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
    Stream postStream = request.EndGetRequestStream(asynchronousResult);
    this.someBodyContentStream.CopyTo(postStream);
    postStream.Close();
    request.BeginGetResponse(GetResponseCallback, request);
}

或选项 2:

void SendRequest()
{
    // here comes the creation of a request using WebRequest.CreateHttp()
    // ...
   
    request.Method = "POST";
    Stream postStream = request.GetRequestStream();
    this.someBodyContentStream.CopyTo(postStream);
    request.BeginGetResponse(GetResponseCallback, request);
}

更新

是否有可能调用Begin...带有回调和对象并返回 an 的方法IAsyncResult将在同一个线程上调用回调,因此,如果处理不当,会在回调释放等待句柄的情况下导致挂起?

标签: c#asynchronoushttpwebrequest

解决方案


推荐阅读