如何从异步中返回一个字符串

eea*_*dev 10 c# asynchronous async-await

我的方法是调用Web服务并异步工作.

得到回应时,一切正常,我得到了回应.

当我需要返回此响应时,问题就开始了.

这是我的方法的代码:

 public async Task<string> sendWithHttpClient(string requestUrl, string json)
        {
            try
            {
                Uri requestUri = new Uri(requestUrl);
                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Clear();
                    ...//adding things to header and creating requestcontent
                    var response = await client.PostAsync(requestUri, requestContent);

                    if (response.IsSuccessStatusCode)
                    {

                        Debug.WriteLine("Success");
                        HttpContent stream = response.Content;
                        //Task<string> data = stream.ReadAsStringAsync();    
                        var data = await stream.ReadAsStringAsync();
                        Debug.WriteLine("data len: " + data.Length);
                        Debug.WriteLine("data: " + data);
                        return data;                       
                    }
                    else
                    {
                        Debug.WriteLine("Unsuccessful!");
                        Debug.WriteLine("response.StatusCode: " + response.StatusCode);
                        Debug.WriteLine("response.ReasonPhrase: " + response.ReasonPhrase);
                        HttpContent stream = response.Content;    
                        var data = await stream.ReadAsStringAsync();
                        return data;
                     }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("ex: " + ex.Message);
                return null;
            }
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

      Task <string> result =  wsUtils.sendWithHttpClient(fullReq, "");           
      Debug.WriteLine("result:: " + result); 
Run Code Online (Sandbox Code Playgroud)

但是在打印结果时,我看到的是这样的: System.Threading.Tasks.Task

如何获取结果字符串,就像我在方法中使用数据一样.

Jam*_*ees 15

您需要执行此操作,因为您同步调用该async方法:

  Task<string> result =  wsUtils.sendWithHttpClient(fullReq, "");           
  Debug.WriteLine("result:: " + result.Result); // Call the Result
Run Code Online (Sandbox Code Playgroud)

Task<string>返回类型视为将来返回值的"承诺".

如果您异步调用异步方法,那么它将如下所示:

  string result =  await wsUtils.sendWithHttpClient(fullReq, "");           
  Debug.WriteLine("result:: " + result);
Run Code Online (Sandbox Code Playgroud)

  • 我称之为异步,它的工作原理,谢谢。我会很快接受的。 (2认同)
  • 等待是没有必要的。Result 属性会阻塞调用线程,直到任务完成。请参阅 https://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx (2认同)

Ste*_*ary 7

异步方法返回表示未来值任务.为了获得包含在该任务中的实际值,您应该:await

string result = await wsUtils.sendWithHttpClient(fullReq, "");
Debug.WriteLine("result:: " + result);
Run Code Online (Sandbox Code Playgroud)

请注意,这将要求您的调用方法是异步的.这既自然又正确.