首页 > 解决方案 > 异步方法将响应发送回 Main

问题描述

我已经使用异步方法实现了一个肥皂客户端。我希望此方法将从 API 服务器获得的字符串值返回到我的主线程或另一个方法(无论调用哪个方法)。我该怎么做呢:

主线

 static void Main(string[] args)
 {

  TEXT().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); });
  Console.ReadKey();

 // if I do it like this
 //  var test =  TEXT().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); });
 // it gives me error: Cannot assign void to an implicitly-typed local variable
  }

异步方法

 public static async Task<string> TEXT()
 {
     Uri uri = new Uri("http://myaddress");
     HttpClient hc = new HttpClient();
     hc.DefaultRequestHeaders.Add("SOAPAction", "Some Action");
     var xmlStr = "SoapContent"; //not displayed here for simplicity
   var content = new StringContent(xmlStr, Encoding.UTF8, "text/xml");


  using (HttpResponseMessage response = await hc.PostAsync(uri, content))
  {
   var soapResponse = await response.Content.ReadAsStringAsync();
   string value = await response.Content.ReadAsStringAsync();
   return value; //how do I get this back to the main thread or any other method
  }
 }

标签: c#.netasync-awaittasktask-parallel-library

解决方案


如果您打算在控制台应用程序中执行大量异步操作,我建议使用这种 MainAsync 模式:

static public void Main(string[] args) //Entry point
{
    MainAsync(args).GetAwaiter().GetResult();
}

static public Task MainAsync(string[] args) //Async entry point
{
    await TEXT();
    Console.WriteLine("finished"); 
}

如果升级到 C# 7.1 或更高版本,则可以删除该Main方法并使用async main

或者,如果您曾经将此代码迁移到 ASP.NET 或 WinForms 应用程序,您可以忽略Main并将代码迁移到其中MainAsync(否则您将与同步模型发生冲突并陷入死锁)。


推荐阅读