繁体   English   中英

如何从字符串方法中获取异步值

[英]How to get async value from string method

我正在使用 API 形式的async方法和我的代码如下,

public async void Test(string token, int tenantId, string fromDate,string searchText)
 {
    try
    {
        string serviceUrl = "http://localhost/Testapi/api/details/requestDetails/Details";

        string jsonParamterData = new JavaScriptSerializer().Serialize(new
        {
            FromDate = fromDate,
            SearchText = searchText,
        });

        HttpClient client = new HttpClient();

        HttpMethod method = new HttpMethod("POST");
        HttpRequestMessage message = new HttpRequestMessage(method, serviceUrl);

        StringContent content = new StringContent(jsonParamterData, Encoding.UTF8, "application/json");
        client.DefaultRequestHeaders.Add("TenantId", tenantId.ToString());
        client.DefaultRequestHeaders.Add("Authorization", string.Format("bearer {0}", token));
        message.Content = content;

        var response = await client.PostAsync(serviceUrl, content);
        var result = await response.Content.ReadAsStringAsync();

        client.Dispose();
    }
  }

我需要从另一种方法获得响应结果。

public string GetValue(){

   
}

但是Test()方法是无效的,那么如何从另一个方法访问Test()结果值呢? 是否可以在async方法中返回值。

更新:

[WebMethod(EnableSession = true)]
    public string GetValue(){
       
    }

但是GetValue()是一个 web 方法

你应该做这样的事情:

public async Task<string> Test(string token, int tenantId, string fromDate,string searchText)
{

    string serviceUrl = "http://localhost/Testapi/api/details/requestDetails/Details";

    string jsonParamterData = new JavaScriptSerializer().Serialize(new
    {
        FromDate = fromDate,
        SearchText = searchText,
    });

    HttpClient client = new HttpClient();

    HttpMethod method = new HttpMethod("POST");
    HttpRequestMessage message = new HttpRequestMessage(method, serviceUrl);

    StringContent content = new StringContent(jsonParamterData, Encoding.UTF8, "application/json");
    client.DefaultRequestHeaders.Add("TenantId", tenantId.ToString());
    client.DefaultRequestHeaders.Add("Authorization", string.Format("bearer {0}", token));
    message.Content = content;

    var response = await client.PostAsync(serviceUrl, content);
    var result = await response.Content.ReadAsStringAsync();

    client.Dispose();
    return result;
}

我强烈建议您避免使用 asmx 来执行异步函数,因为它已被弃用和停用。 为了更清楚地说明,我应该说 async/await 模式在较低版本的 .net 框架中有一些开销。 您可以使用至少 Wcf 个基于 do.net-core 或最新版本的 .NetFramework 的服务,如 4.6+。 另一种选择是将 Rest Apis 与基于 As.net 或 As.netCore 的异步/等待承诺结合使用。 但是,如果您选择继续当前的解决方案,您可以在此处查看检查 asmx WebMethods 的异步执行: https://learn.microsoft.com/en-us/previous-versions/do.net/articles/aa480516(v=msdn .10)?redirectedfrom=MSDN

如果你想同时使用 AsyncCallBack 和 async/await 模式,你可以这样做:

public IAsyncResult BeginGetvalue(AsyncCallback cb, Object state)
{
    Action action = async () => {
       string result = await GetValue();
    };

    return action.BeginInvoke(cb, state);
}

我要再次注意:请不要自己这样做。 ASMX 已弃用解决方案:(使用这些技术来处理您的解决方案:

  • 基于.netcore + kestrel 的Async Restful api
  • 基于 as.net-mvc + self-hosted-owin 的异步 Restful api
  • 基于http2+和.net5的grpc解决方案
  • Wcf-Services in.netcore on.netframework。 以上所有技术都支持异步方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM