【问题标题】:How to call an async method?如何调用异步方法?
【发布时间】:2017-03-17 05:43:23
【问题描述】:

我不熟悉 .NET 中的线程。

我有一个异步方法 MyTest:

public async Task MyTest() {
    using (HttpClient httpClient = new HttpClient()) {
        httpClient.BaseAddress = new Uri(_uri);

        var response = await httpClient.GetAsync("API/GetData");

        if(response!=null && response.IsSuccessStatusCode) {
            var json = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
        }
    }
}

我遇到的问题是调用方法来获取结果(字典)。

当我逐步执行我的代码时,我看到 IsCompleted 在结果从我的休息调用返回之前完成。

在这种情况下如何正确使用线程?

我调用异步方法的方法。

public void GetTestData()
{
    try
    {                
        ARestService rest = new ARestService();
        Task tsk = new Task(rest.MyTest);
        if (tsk.IsCompleted)
        {
            var tst = "Done?";
        }
    }
    catch(Exception ex)
    {
        string a = ex.Message;
    }
}

【问题讨论】:

  • 请随意阅读一些关于 async/await 的教程,而不是在黑暗中摸索。
  • 只需调用它并等待结果。或者直接等待。该方法是异步的,因为 .ReadAsStringAsync 已经是异步的并且在后台运行。该方法返回一个已经在运行的任务,你只需要等待
  • 如果您希望它是异步的(线程在等待 IO 时不会阻塞),您想要的是 await 它,或者您可以在任务上调用 ResultWait同步阻塞线程。
  • NOT a duplicate,这个问题是关于async void,一个非常特殊的情况。

标签: c#


【解决方案1】:

如果您可以将 GetTestData 方法转换为 async 方法,只需执行此操作即可。

public async Task GetTestData()
{
    try
    {                
        ARestService rest = new ARestService();
        await rest.MyTest();
        var tst = "Done?";
    }
    catch(Exception ex)
    {
        string a = ex.Message;
    }
}

您还应该使用以下语句定义您的方法返回Task&lt;Dictionary&lt;string, string&gt;&gt; 以接收您的休息服务调用的结果。

Dictionary<string, string> dict = await rest.MyTest();

如果没有,请查看一些变通方法,例如使用 GetAwaiter().GetResult(),但正如此问题 Is .GetAwaiter().GetResult(); safe for general use? 中所述,它可能会导致一些问题,因此最好的选择是让您的调用代码也异步。

【讨论】:

  • 首先,您隐藏了可能的异常。其次,另一个问题是关于async voidonly。如果你想同步阻塞,你可以在返回值上调用.Result
  • 好点!我意识到链接不是完全相同的场景。我很少只在控制台应用程序中使用GetAwaiter().GetResult() 解决方法。
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多