在我的方法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调用,...
现在我不确定我是否以正确的方式使用这种异步。
答案 0 :(得分:9)
现在我不确定我是否以正确的方式使用这种异步。
听起来不像。仅仅因为你有一个async
方法并不意味着它将在一个单独的线程上运行 - 听起来就像你期待的那样。当您执行async
方法时,它将同步运行 - 即正常情况 - 直到它遇到第一个await
表达式。如果你没有拥有任何await
表达式,这意味着它将正常运行,唯一的区别在于它在状态机中的运行方式,具有完成状态(任务代表的异常等。
我怀疑您应该将CreateHistogramAsync
和CalculatePropValuesAsync
方法更改为同步:
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)
如果您没有等待最后两种方法中的任何内容,请从声明中删除异步。在这种情况下,创建和返回任务就足以实现您的目标。