从异步方法返回输出时推荐的方法签名?

And*_*son 14 .net c# async-await async-ctp windows-runtime

我有一个异步方法:

public async Task<BitmapSource> GetBitmapAsync(double[] pixels);
Run Code Online (Sandbox Code Playgroud)

假设我也有这个课程:

public class PixelData
{
    public double[] Pixels { get; }
}
Run Code Online (Sandbox Code Playgroud)

我现在想要创建一个生成BitmapSource输出的方便方法,使用上面的异步方法来完成工作.我可以提出至少三种方法来做到这一点,但对于我来说,从效率和可靠性的角度来看,我应该选择哪一种方法.

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

选项A创建一个返回以下内容Result的同步方法Task:

public BitmapSource GetBitmap(PixelData pixelData)
{
    return GetBitmapAsync(pixelData.Pixels).Result;
}
Run Code Online (Sandbox Code Playgroud)

选项B创建一个返回Task<BitmapSource>以下内容的同步(或它是异步?)方法:

public Task<BitmapSource> GetBitmap(PixelData pixelData)
{
    return GetBitmapAsync(pixelData.Pixels);
}
Run Code Online (Sandbox Code Playgroud)

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

public async Task<BitmapSource> GetBitmapAsync(PixelData pixelData)
{
    return await GetBitmapAsync(pixelData.Pixels);
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ler 6

我觉得你在想这个.

你有一个方法返回恰好是一个类型Task<T>.您需要一种方法,该方法采用不同类型的参数并传递给原始方法.因此选项B很好:

public Task<BitmapSource> GetBitmap(PixelData pixelData)
{
    return GetBitmapAsync(pixelData.Pixels);
}
Run Code Online (Sandbox Code Playgroud)

应该调用该方法GetBitmapAsync.

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

选项C实际上没有达到比选项B更多的功能.

  • 此外,选项A [可能导致死锁](http://nitoprograms.blogspot.com/2012/07/dont-block-on-async-code.html).Stephen Toub有[关于异步性能的好视频](http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-829T),他指出选项C不是一个好主意(出于开销原因) . (2认同)