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

在我的方法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调用,…

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

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

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

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