如何调用异步方法?

时间:2016-11-03 15:03:20

标签: c#

我不熟悉.NET中的线程。

我有一个ansync方法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;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您可以将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<Dictionary<string, string>>以接收您的休息服务调用的结果,并使用以下语句。

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

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