2013-02-28 51 views
3

在我的方法RecalcChartAsync我做了一些时间密集的东西..所以我想我会做一些异步的事情。async方法是否正确? Resharper警告

我想开始两种方法CreateHistogramAsyncCalculatePropValuesAsync,同时在我的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 async关键字以下警告:

这种异步方法缺乏“等待”运营商和意志同步运行。考虑使用await运算符来等待非阻塞API调用,...

现在我不确定是否以正确的方式使用此异步事件。

+0

执行异步方法时,始终返回任务。否则,你会失去与该方法的任何连接。这可能是问题,特别是在测试期间。 – Andree 2016-04-20 11:08:38

+0

此外,如果你想等待更多的任务完成,你可以使用'await Task.WhenAll(params Task [] tasks)' – Andree 2016-04-20 11:12:41

回答

9

现在我不知道如果我在正确的方式使用此异步的事情。

听起来不像它。只是因为你有一个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; 
} 
+0

你的代码不会以这种方式工作..我必须调用'Task.Run((=) > CreateHistogram());'或创建一个动作/委托。 thx无论如何,你的答案仍然很好:) – JuHwon 2013-02-28 15:07:30

+1

@Hown_:嗯......超载和方法组转换是一个讨厌的组合。一个简单的演员应该虽然工作 - 编辑... – 2013-02-28 15:17:41

+0

铸造'无效'类型到'行动'不会工作;) – JuHwon 2013-03-01 10:58:31

1

如果你不等待任何东西你两个最后的方法,然后从声明中删除异步。在这种情况下,创建和返回任务就足以实现你想要的。