异步方法是否正确? 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
表达式,那意味着它将正常运行,唯一的区别在于它在状态机中的包装方式,以及由任务表示的完成状态(例外等)。
我怀疑你应该将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; }
你的方法中没有任何东西在等待,所以标记为async
是毫无意义的。 这就是ReSharper警告你的原因。
您应该从学习async
/ await
如何工作开始: http : //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
如果您没有等待最后两种方法中的任何内容,请从声明中删除异步。 在这种情况下,创建和返回任务将足以实现您想要的。
- 仅当使用NetworkService时,站点才会使用ApplicationPoolIdentity在本地启动:“HTTP错误503.服务不可用”。
- 具有动态maxCount的SemaphoreSlim
- 什么时候.NET Monitor完全进入内核模式?
- Uri.EscapeDataString很奇怪
- 生产线上的行号在NLog日志中消失
- Akka.net开始和停止没有任何活动
- 如何在此父方法中等待没有异步修饰符的异步方法?
- 如何在不中断async / await的情况下创建HttpWebRequest?
- ServiceStack Ormlite:System.InvalidProgramException JIT编译器遇到内部限制