【问题标题】:How can I return a string from callback?如何从回调中返回字符串?
【发布时间】:2017-03-15 10:31:37
【问题描述】:

我有一个方法

 private string MakeRequest

之前给我返回了一个字符串,但现在我在这个方法中有一个异步操作。

request.BeginGetRequestStream(GetRequestStreamCallback, request);

 private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        var request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        var postStream = request.EndGetRequestStream(asynchronousResult);

        // Convert the string into a byte array.
        byte[] byteArray = Encoding.UTF8.GetBytes(request.Connection);

        // Write to the request stream.
        postStream.Write(byteArray, 0, request.Connection.Length);
        postStream.Close();

        // Start the asynchronous operation to get the response
        request.BeginGetResponse(GetResponseCallback, request);
    }

    private static void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        var request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        var response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        var streamResponse = response.GetResponseStream();
        using (var streamRead = new StreamReader(streamResponse))
        {
            var responseString = streamRead.ReadToEnd();
            var trimResponseString = responseString.Trim(); // I need this string to return from MakeRequest
            // Close the stream object
            streamResponse.Close();
            streamRead.Close();

            // Release the HttpWebResponse
            response.Close();
            allDone.Set();
        }
    }

如何将上次回调的字符串返回给 MakeRequest?

【问题讨论】:

  • 您是否考虑过改用任务? WebRequest.GetRequestStreamAsync 返回一个任务,你可以等待它。不知道你从哪里调用,但如果它的 WPF、WinForms、asp.net 你的条目可以标记为async,并返回某种形式的Task。然后您可以等待GetRequestStreamAsync
  • @Igor,我该怎么做?我以前从未这样做过。
  • 您使用的是什么版本的 .NET?现在有很多更简单的方法可以做到这一点。
  • @JLRishe .NET 4.5
  • @Ekaterina - 你的切入点是什么(即你从什么地方调用它)?控制台应用程序、wpf、winforms、mvc、asp.net,还有什么?

标签: c# .net asynchronous callback


【解决方案1】:

如果您使用的是 .NET 4.5,则可以利用 WebRequest 中基于 Task 的方法:

public async Task<string> MakeRequest()
{
    var request = WebRequest.Create(url);

    var postStream = await request.GetRequestStreamAsync();

    // Convert the string into a byte array.
    byte[] byteArray = Encoding.UTF8.GetBytes(request.Connection);

    // Write to the request stream.
    postStream.Write(byteArray, 0, request.Connection.Length);
    postStream.Close();

    var response = (HttpWebResponse)(await request.GetResponseAsync());
    var streamResponse = response.GetResponseStream();

    using (var streamRead = new StreamReader(streamResponse))
    {
        var responseString = streamRead.ReadToEnd();
        var trimResponseString = responseString.Trim(); // I need this string to return from MakeRequest
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();

        // Release the HttpWebResponse
        response.Close();
        allDone.Set();

        return trimResponseString;
    }
}

如果您从本身不是异步的上下文中调用此方法,则可以调用此方法,然后同步等待结果:

string result = MakeRequest().GetAwaiter().GetResult();

【讨论】:

  • 但是 HttpWebResponse 是不可等待的 var response = await (HttpWebResponse)request.GetResponseAsync();
  • @Ekaterina 抱歉,需要重新排列括号。请查看我的更新。
猜你喜欢
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
相关资源
最近更新 更多