gpt4 book ai didi

c# - 等待等待另一个 IAsyncResult 的 IAsyncResult 方法(链接)

转载 作者:太空狗 更新时间:2023-10-30 00:35:09 25 4
gpt4 key购买 nike

(只能使用 .NET 3.5 stock,所以没有任务,没有响应式扩展)

我有,我认为这是一个简单的案例,但我对此感到困惑。

简而言之,我将 BeginGetRequestStream 的 IAsyncResult 返回给 BeginMyOperation() 的调用者,我想真正发送回 BeginGetResponse 的 IAsyncResult,它在调用 EndGetRequestStream 时被调用。

所以我想知道,我该怎么办

      public IAsyncResult BeginMyOperation(...)
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(requestUri);
webRequest.Method = "POST";

// This is the part, that puzzles me. I don't want to send this IAsyncResult back.
return webRequest.BeginGetRequestStream(this.UploadingStreamCallback, state);
}

// Only want this to be called when the EndGetResponse is ready.
public void EndMyOperation(IAsyncResult ar)
{

}

private IAsyncResult UploadingStreamCallback(IAsyncResult asyncResult)
{
using (var s = state.WebRequest.EndGetRequestStream(asyncResult))
{
using (var r = new BinaryReader(state.Request.RequestData))
{
byte[] uploadBuffer = new byte[UploadBufferSize];
int bytesRead;
do
{
bytesRead = r.Read(uploadBuffer, 0, UploadBufferSize);

if (bytesRead > 0)
{
s.Write(uploadBuffer, 0, bytesRead);
}
}
while (bytesRead > 0);
}
}

// I really want to return this IAsyncResult to the caller of BeginMyOperation
return state.WebRequest.BeginGetResponse(new AsyncCallback(state.Callback), state);
}

最佳答案

我认为解决这个问题的最简单方法是使用 Task 包装器。特别是,您可以完成 TaskCompletionSource BeginGetResponse 完成时。然后返回 Task for that TaskCompletionSource .请注意,Task 实现了 IAsyncResult,因此您的客户端代码无需更改。

就我个人而言,我会更进一步:

  1. BeginGetRequestStream 包装在 Task 中(使用 FromAsync )。
  2. 为处理请求的 Task 创建一个延续,并将 BeginGetResponse 包装在 Task 中(再次使用 FromAsync).
  3. 为完成 TaskCompletionSource 的第二个 Task 创建延续。

恕我直言,TaskIAsyncResult 更自然地处理异常和结果值。

关于c# - 等待等待另一个 IAsyncResult 的 IAsyncResult 方法(链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5534193/

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