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

JuH*_*won 3 c# task-parallel-library async-await .net-4.5

在我的方法中,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
}
Run Code Online (Sandbox Code Playgroud)

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

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

现在我不确定我是否以正确的方式使用这个异步的东西.

Jon*_*eet 9

现在我不确定我是否以正确的方式使用这个异步的东西.

听起来不像.仅仅因为你有一个async方法并不意味着它将在一个单独的线程上运行 - 这听起来就像你期待的那样.当你执行一个async方法时,它会同步运行 - 就像正常一样 - 直到它碰到第一个await表达式.如果你不具备任何await表情,这意味着它只是运行正常,唯一的区别是,它的包裹在一个状态机,由一个代表任务完成状态(异常等)的方式.

我怀疑你应该改变你CreateHistogramAsyncCalculatePropValuesAsync方法只是同步:

private void CreateHistogram()
{
    ...
}

private void CalculatePropValues()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

并用于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;
}
Run Code Online (Sandbox Code Playgroud)