【问题标题】:how do I return values from a `async Task` function?如何从“异步任务”函数返回值?
【发布时间】:2017-12-16 01:43:24
【问题描述】:

我需要从下面的async Task testWCF2 函数返回值submitOut?谁能提供指导?

    public static async Task testWCF2(string xmlConfig)
    {
        string submitOut;

        using (var client = new System.Net.Http.HttpClient())
        {
            var url = "http://server:8100/api/SoftwareProductBuild";
            var content = new StringContent(xmlConfig, Encoding.UTF8, "application/xml");
            var response = await client.PostAsync(url, content);
            if (response.IsSuccessStatusCode)
            {
                var responseBody = await response.Content.ReadAsStringAsync();
                submitOut = responseBody;
            }
            else
            {
                submitOut = string.Format("Bad Response {0} \n", response.StatusCode.ToString());
                submitOut = submitOut + response;
            }
        }
    }

    public string QlasrSubmit(List<XMLSiInfo> xmlConfigs)
    {
        string submitOut = "QLASR: ";

        foreach (XMLSiInfo xmlConfig in xmlConfigs)
        {
            submitOut = submitOut + "\n" + testWCF2(xmlConfig.xml).ToString();
        }

        return submitOut;
    }

    public string QlasrPostcommit(string si, string sp, string variant = null)
    {
        .............
        string submitStatus            = QlasrSubmit(siInfo);
        ....
        return submitStatus;
    }

【问题讨论】:

    标签: asp.net wcf async-await


    【解决方案1】:

    将您的返回类型更改为Task&lt;string&gt;,如下所示:

    public static async Task<string> testWCF2(string xmlConfig)
    

    那你可以return submitOut;

    一旦你返回一个值,你就可以使用await

    public async Task<string> QlasrSubmit(List<XMLSiInfo> xmlConfigs)
    {
      string submitOut = "QLASR: ";
    
      foreach (XMLSiInfo xmlConfig in xmlConfigs)
      {
        submitOut = submitOut + "\n" + await testWCF2(xmlConfig.xml);
      }
    
      return submitOut;
    }
    

    我建议阅读basics of async

    【讨论】:

    • - 稍微更新了我的问题,它在string submitStatus = QlasrSubmit(siInfo); 行抛出错误Cannot implicitly convert type 'System.Threading.Tasks.Task&lt;string&gt;' to 'string'
    • 有没有不将QlasrPostcommit返回类型转换为Task&lt;string&gt;的解决方案
    • @user3508811: QlasrSubmit 现在也是异步的,因此您需要使用 await 来使用它。
    • @user3508811:如果你要使用async,你应该use async all the way;你有什么不想要的理由吗?
    • 现在我在多个地方都有返回类型,有没有办法用异步和等待发布await client.PostAsync,我收到错误"QLASR: \nSystem.Threading.Tasks.Task1[System.Threading.Tasks.VoidTaskResult]`这些线程任务,所以尽量避免
    【解决方案2】:
    public static async Task<string> testWCF2(string xmlConfig)
    {
        string submitOut;
    
        using (var client = new System.Net.Http.HttpClient())
        {
            var url = "http://server:8100/api/SoftwareProductBuild";
            var content = new StringContent(xmlConfig, Encoding.UTF8, "application/xml");
            var response = await client.PostAsync(url, content);
            if (response.IsSuccessStatusCode)
            {
                var responseBody = await response.Content.ReadAsStringAsync();
                submitOut = responseBody;
            }
            else
            {
                submitOut = string.Format("Bad Response {0} \n", response.StatusCode.ToString());
                submitOut = submitOut + response;
            }
        }
    
        return submitOut;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 2020-09-13
      • 2013-03-22
      • 2021-03-04
      • 2022-01-14
      • 2015-01-12
      • 2016-08-27
      • 2021-04-04
      相关资源
      最近更新 更多