【发布时间】:2012-08-08 16:38:41
【问题描述】:
我有一个异步方法:
public async Task<BitmapSource> GetBitmapAsync(double[] pixels);
假设我也有这个课程:
public class PixelData
{
public double[] Pixels { get; }
}
我现在想创建一个产生BitmapSource 输出的便捷方法,使用上面的异步方法来完成这项工作。我可以想出至少三种方法来做到这一点,但从效率和可靠性的角度来看,我应该选择哪一种并不是很明显。
有人可以建议吗?以下每种方法的优缺点是什么?
选项A创建一个同步方法,返回Task的Result:
public BitmapSource GetBitmap(PixelData pixelData)
{
return GetBitmapAsync(pixelData.Pixels).Result;
}
选项 B 创建一个返回 Task<BitmapSource> 的同步(还是异步?)方法:
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<BitmapSource>的事实与(a)同步性无关吗? -
@AndersGustafsson,它不会同步运行。
-
方法不可等待。 Only types are awaitable,所以无论是从
async还是非async方法返回,您都可以await和Task。
标签: c# .net windows-runtime async-await async-ctp