gpt4 book ai didi

c# - Task.Factory.FromAsync 等效于 HttpWebRequest 和请求流代码

转载 作者:行者123 更新时间:2023-11-30 22:16:02 26 4
gpt4 key购买 nike

我有以下扩展方法用于对 WebRequest 对象使用异步调用。

 public static Task<WebResponse> GetReponseAsync(this WebRequest request)
{
return Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
}

public static Task<Stream> GetRequestStreamAsync(this WebRequest request)
{
return Task.Factory.FromAsync<Stream>(request.BeginGetRequestStream, request.EndGetRequestStream, null);
}

我想使用这些扩展方法将以下代码转换为异步等效代码。

using (Stream rs = request.GetRequestStream())
{
var postData = Encoding.ASCII.GetBytes(PostData);
rs.Write(postData, 0, postData.Length);

using (WebResponse response = request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
str = reader.ReadToEnd();

rs.Close();
reader.Close();
response.Close();
}
}

我使用另一段使用 WebRequest 的代码轻松地做到了这一点,但是这不需要第一次调用 GetRequestStream()。

request.GetReponseAsync().ContinueWith(t =>
{
if (t.Exception == null)
{
using (var sr = new StreamReader(t.Result.GetResponseStream()))
{
str = sr.ReadToEnd();
}
}
});

我如何转换第一个代码块以使用我的扩展方法并等效?

编辑我使用的是 .NET 4.0,所以 async/await 目前不是一个选项。

最佳答案

你只需要链接 ContinueWith电话。根据经验,序列中的每个异步操作都会有一个 ContinueWith。每个 ContinueWith 通常以 return <some async call> 结尾下一个将开始处理其结果。

request.GetRequestStreamAsync()
.ContinueWith((trs) =>
{
var postData = System.Text.Encoding.ASCII.GetBytes("dummy");
trs.Result.Write(postData, 0, postData.Length);
return request.GetResponseAsync();
}).Unwrap()
.ContinueWith((resp) =>
{
using (var sr = new StreamReader(resp.Result.GetResponseStream()))
{
var str = sr.ReadToEnd();
}
});

请注意,在我的代码(以及您的异步版本)中,并非所有对象都像在原始代码中那样被处置。

在每个步骤中,您可能想要检查 Status 或 IsFaulted/IsCanceled 属性,或者使用带有 TaskContinuationOptions 参数的 ContinueWith 重载。对于后一个选项,请注意前一个任务未以与选项匹配的方式完成,这会导致任务被取消。如果您需要传递错误,则该方法不会。就个人而言,我将所有检查包装到一个方法中,该方法要么通过错误和取消,要么在成功完成时运行委托(delegate)。否则,您会很快得到大量样板检查代码。

关于c# - Task.Factory.FromAsync 等效于 HttpWebRequest 和请求流代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com