Рекомендуемая подпись метода при возврате вывода из асинхронного метода?

У меня есть один асинхронный метод:

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

Скажем, у меня тоже есть этот класс:

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

Теперь я хочу создать метод удобства, создающий вывод BitmapSource, используя выше описанный выше асинхронный метод. Я могу придумать по крайней мере три подхода, чтобы сделать это, но мне не сразу кажется, какой из них я должен выбрать с точки зрения эффективности и надежности.

Может кто-нибудь посоветует; каковы преимущества и недостатки каждого из следующих подходов?

Вариант A Создайте синхронный метод, который возвращает Result в Task:

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);
}

Ответы

Ответ 1

Я думаю, вы слишком задумываетесь об этом.

У вас есть метод, который возвращает тип, который является Task<T>. Вам нужен метод, который принимает другой тип параметра и переходит к исходному методу. Таким образом, вариант B в порядке:

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

Метод следует называть GetBitmapAsync, хотя.

Вариант A будет способом разоблачения синхронной (блокирующей) версии метода.

Вариант C фактически не достигает ничего большего, чем вариант B.