异步方法是否正确? Resharper警告

时间:2013-02-28 14:52:10

标签: c# task-parallel-library .net-4.5 async-await

在我的方法RecalcChartAsync中我做了一些时间密集的事情..所以我想我会做一些异步的事情。

我想启动两个方法CreateHistogramAsync CalculatePropValuesAsync,同时在我的RecalcChartsAsync中做一些事情,最后等待它完成。

 private async void RecalcChartsAsync()
{
    var histogram = CreateHistogramAsync();
    var propValues = CalculatePropValuesAsync();

    //do some other stuff

    await histogram;
    await propValues;
}

private async Task CreateHistogramAsync()
{
    //do some stuff
}

private async Task CalculatePropValuesAsync()
{
    //do some stuff
}

我不确定我是否采用正确的方法,因为ReSharper在CreateHistogramAsync和CalculatePropValueAsync的异步关键字上给出了以下警告:

  

这种异步方法缺少'await'运算符并将同步运行。考虑使用await运算符等待非阻塞API调用,...

现在我不确定我是否以正确的方式使用这种异步。

3 个答案:

答案 0 :(得分:9)

  

现在我不确定我是否以正确的方式使用这种异步。

听起来不像。仅仅因为你有一个async方法并不意味着它将在一个单独的线程上运行 - 听起来就像你期待的那样。当您执行async方法时,它将同步运行 - 即正常情况 - 直到它遇到第一个await表达式。如果你没有拥有任何await表达式,这意味着它将正常运行,唯一的区别在于它在状态机中的运行方式,具有完成状态(任务代表的异常等。

我怀疑您应该将CreateHistogramAsyncCalculatePropValuesAsync方法更改为同步:

private void CreateHistogram()
{
    ...
}

private void CalculatePropValues()
{
    ...
}

并使用Task.Run并行执行它们:

private async void RecalcChartsAsync()
{
    var histogram = Task.Run((Action) CreateHistogram);
    var propValues = Task.Run((Action) CalculatePropValues);

    //do some other stuff

    await histogram;
    await propValues;
}

答案 1 :(得分:3)

您的方法中没有任何东西在等待,因此标记为async毫无意义。这就是ReSharper警告你的原因。

您应该从了解async / await的工作原理开始:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

答案 2 :(得分:1)

如果您没有等待最后两种方法中的任何内容,请从声明中删除异步。在这种情况下,创建和返回任务就足以实现您的目标。