【问题标题】:async Methods correct? Resharper warning异步方法正确吗?更清晰的警告
【发布时间】:2013-02-14 19:41:15
【问题描述】:

在我的方法RecalcChartAsync 中,我做了一些时间密集型的工作......所以我想我会做一些异步的事情。

我想启动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 的异步关键字处给了我以下警告:

此异步方法缺少“等待”运算符,将同步运行。考虑使用 await 运算符来等待非阻塞 API 调用,...

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

【问题讨论】:

  • 在实现异步方法时总是返回 Task。否则,您将失去与该方法的任何连接。这可能是问题,尤其是在测试期间。
  • 另外,如果你想等待更多任务完成,你可以使用await Task.WhenAll(params Task[] tasks)

标签: c# task-parallel-library .net-4.5 async-await


【解决方案1】:

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

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

【讨论】:

  • 你的代码不会这样工作。我必须打电话给Task.Run(() => CreateHistogram()); 或创建一个动作/代表。 thx 无论如何你的回答还是不错的:)
  • @Hown_:嗯...重载和方法组转换是一个讨厌的组合。一个简单的演员应该可以工作 - 编辑...
  • @Hown_:你试过了吗?请注意,我正在转换方法组,而不是方法的调用。我刚刚在一个示例项目中尝试过,很好。
  • 啊啊啊谢谢。完全是我的失败……你的猜测是对的!我调用了该方法;)!太棒了!
【解决方案2】:

在您的方法中没有您等待的任何内容,因此将其标记为async 毫无意义。这就是 ReSharper 警告您的原因。

您应该从了解async/await 的工作原理开始:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 2018-02-18
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2016-09-29
      • 2013-05-05
      • 2013-06-12
      相关资源
      最近更新 更多