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调用,...
现在我不确定我是否以正确的方式使用这个异步的东西.
现在我不确定我是否以正确的方式使用这个异步的东西.
听起来不像.仅仅因为你有一个async方法并不意味着它将在一个单独的线程上运行 - 这听起来就像你期待的那样.当你执行一个async方法时,它会同步运行 - 就像正常一样 - 直到它碰到第一个await表达式.如果你不具备任何await表情,这意味着它只是运行正常,唯一的区别是,它的包裹在一个状态机,由一个代表任务完成状态(异常等)的方式.
我怀疑你应该改变你CreateHistogramAsync和CalculatePropValuesAsync方法只是同步:
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)