async方法正确吗?Resharper警告

本文关键字:Resharper 警告 方法 async | 更新日期: 2023-09-27 18:01:30

在我的方法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给了我以下警告在async关键字在CreateHistogramAsync和CalculatePropValueAsync:

这个异步方法缺少'await'操作符,将同步运行。考虑使用await操作符来等待非阻塞API调用,…

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

async方法正确吗?Resharper警告

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

听起来不像。仅仅因为你有一个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;
}

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

您应该从学习async/await如何工作开始:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

如果您在最后两个方法中没有等待任何内容,那么从声明中删除异步。在本例中,创建并返回任务就足以实现您想要的效果。