3

在我的方法中,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 运算符来等待非阻塞 API 调用,...

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

4

3 回答 3

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;
}
于 2013-02-28T14:57:00.287 回答
3

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

你应该从学习如何async/await工作开始:http: //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

于 2013-02-28T14:55:46.770 回答
1

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

于 2013-02-28T14:57:35.780 回答