Mi método es llamar a un servicio web y trabajar de forma asíncrona.
Al obtener respuesta, todo funciona bien y recibo mi respuesta.
El problema comienza cuando necesito devolver esta respuesta.
aquí está el código de mi método:
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; }y lo estoy llamando de esta manera:
Task <string> result = wsUtils.sendWithHttpClient(fullReq, ""); Debug.WriteLine("result:: " + result); pero al imprimir el resultado veo algo como esto: System.Threading.Tasks.Task
¿Cómo puedo obtener la cadena de resultados como lo hice con los datos dentro de mi método?
Debe hacer esto ya que está llamando al método async sincrónicamente :
Task<string> result = wsUtils.sendWithHttpClient(fullReq, ""); Debug.WriteLine("result:: " + result.Result); // Call the Result Piense en el tipo de retorno Task<string> como una 'promesa' de devolver un valor en el futuro.
Si llamó al método asíncrono de forma asíncrona, sería como lo siguiente:
string result = await wsUtils.sendWithHttpClient(fullReq, ""); Debug.WriteLine("result:: " + result);Un método asíncrono devuelve una tarea , que representa un valor futuro . Para obtener el valor real envuelto en esa tarea, debe await :
string result = await wsUtils.sendWithHttpClient(fullReq, ""); Debug.WriteLine("result:: " + result);Tenga en cuenta que esto requerirá que su método de llamada sea asíncrono. Esto es natural y correcto.