Рекомендуемая подпись метода при возврате вывода из асинхронного метода?
У меня есть один асинхронный метод:
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.