代码之家  ›  专栏  ›  技术社区  ›  user726720

将响应发送回main的异步方法

  •  0
  • user726720  · 技术社区  · 6 年前

    我使用异步方法实现了一个SOAP客户机。我希望此方法将从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
      }
     }
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Yeldar Kurmangaliyev    6 年前

    在Pre-C 7.0控制台应用程序中,可以实现以下简单操作:

    public static void Main()
    {
        string result = TEXT().Result;
        Console.WriteLine(result);
    }
    

    在这种情况下 TEXT 可以被认为是一种通常的方法,它返回 Task<string> ,因此其结果可在 Result 财产。你不必为等待者、结果等操心。

    同时,在大多数类型的应用程序(winforms、wpf、asp.net等)中都不能这样做,在这种情况下,必须在所有应用程序中使用async/await:

    public async Task SomeMethod()
    {
        string result = await TEXT();
        // ... do something with result
    }
    
        2
  •  1
  •   John Wu    6 年前

    如果您计划在控制台应用程序中执行大量异步操作,我建议您使用此类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应用程序,则可以忽略 主要的 并将代码迁移到 MainAsync (否则,您将运行与同步模型冲突的模型,并导致死锁)。

        3
  •  0
  •   Derviş Kayımbaşıoğlu    6 年前

    在C 7.0+中,您可以使用 async Task Main

    static async Task Main(string[] args)
    {
        var result =  TEXT().ConfigureAwait(false)
        Console.ReadKey();
    }
    

    对于旧版本的C#

    public static void Main(string[] args)
    {
      try
      {
        TEST().GetAwaiter().GetResult();
      }
      catch (Exception ex)
      {
        WriteLine($"There was an exception: {ex.ToString()}");
      }
    }