Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从回调返回字符串?_C#_.net_Asynchronous_Callback - Fatal编程技术网

C# 如何从回调返回字符串?

C# 如何从回调返回字符串?,c#,.net,asynchronous,callback,C#,.net,Asynchronous,Callback,我有办法 private string MakeRequest 它在前面返回了一个字符串,但现在我在这个方法中有一个异步操作 request.BeginGetRequestStream(GetRequestStreamCallback, request); private void GetRequestStreamCallback(IAsyncResult asynchronousResult) { var request = (HttpWebRequest)as

我有办法

 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

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

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;
    }
}

你考虑过用任务来代替吗
WebRequest.GetRequestStreamAsync
返回一个任务,您可以等待。不确定您从何处调用,但如果它是WPF、WinForms、asp.net,您的条目可以标记为
async
,并返回某种形式的
任务
。然后您可以等待
GetRequestStreamAsync
@Igor,我应该怎么做?我以前从未这样做过。你使用的是什么版本的.NET?现在有很多更简单的方法可以做到这一点。@JLRishe.net4。5@Ekaterina-你的切入点是什么(即,你从何处对此进行称呼)?控制台应用程序、wpf、winforms、mvc、asp.net等?但HttpWebResponse不是可等待的var response=await(HttpWebResponse)request.GetResponseAsync()@叶卡捷琳娜抱歉,需要重新排列括号。请看我的更新。
string result = MakeRequest().GetAwaiter().GetResult();