【问题标题】:Recommended method signature when returning output from asynchronous method?从异步方法返回输出时推荐的方法签名?
【发布时间】:2012-08-08 16:38:41
【问题描述】:

我有一个异步方法:

public async Task<BitmapSource> GetBitmapAsync(double[] pixels);

假设我也有这个课程:

public class PixelData
{
    public double[] Pixels { get; }
}

我现在想创建一个产生BitmapSource 输出的便捷方法,使用上面的异步方法来完成这项工作。我可以想出至少三种方法来做到这一点,但从效率和可靠性的角度来看,我应该选择哪一种并不是很明显。

有人可以建议吗?以下每种方法的优缺点是什么?

选项A创建一个同步方法,返回TaskResult

public BitmapSource GetBitmap(PixelData pixelData)
{
    return GetBitmapAsync(pixelData.Pixels).Result;
}

选项 B 创建一个返回 Task&lt;BitmapSource&gt; 的同步(还是异步?)方法:

public Task<BitmapSource> GetBitmap(PixelData pixelData)
{
    return GetBitmapAsync(pixelData.Pixels);
}

选项 C 创建一个显式使用 await 的异步方法:

public async Task<BitmapSource> GetBitmapAsync(PixelData pixelData)
{
    return await GetBitmapAsync(pixelData.Pixels);
}

【问题讨论】:

  • 您也希望能够异步调用此便捷方法吗?如果是这样,从我的表面上看,前两个选项不会实现这一点,只有第三个可以。
  • 不一定(我想异步调用便捷方法),但如果这是最可靠/正确的方法,那么可以。
  • @AdamHouldsworth 对不起,我对这件事的无知,但选项 B 会肯定作为同步方法处理吗?它返回Task&lt;BitmapSource&gt; 的事实与(a)同步性无关吗?
  • @AndersGustafsson,它不会同步运行。
  • 方法不可等待。 Only types are awaitable,所以无论是从async 还是非async 方法返回,您都可以awaitTask

标签: c# .net windows-runtime async-await async-ctp


【解决方案1】:

我觉得你想多了。

你有一个方法返回一个恰好是Task&lt;T&gt; 的类型。您需要一个采用不同类型参数并传递给原始方法的方法。所以选项B很好:

public Task<BitmapSource> GetBitmap(PixelData pixelData)
{
    return GetBitmapAsync(pixelData.Pixels);
}

该方法应该被称为GetBitmapAsync

选项 A 将是公开该方法的同步(阻塞)版本的方式。

选项 C 实际上并没有比选项 B 实现更多。

【讨论】:

  • 谢谢,尼古拉斯!选项 C 是否比选项 B更糟糕,因为它会增加冗余的异步处理?还是这两个选项在内部是等效的?
  • 另外,选项 A can cause deadlocks。 Stephen Toub 有一个good video on async performance,他指出选项 C 不是一个好主意(出于开销原因)。
猜你喜欢
  • 2014-01-13
  • 2020-04-28
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2013-05-03
  • 2012-12-20
相关资源
最近更新 更多