Представление синхронных и асинхронных версий одного и того же методаC#

Место общения программистов C#
Ответить
Anonymous
 Представление синхронных и асинхронных версий одного и того же метода

Сообщение Anonymous »

У меня есть метод со следующей сигнатурой метода (.NET 8, C# 12):

Код: Выделить всё

public static async Task GetModelFromSchemaAsync (SqlConnection connection, CancellationToken cancellationToken = default)
{
var model = new Model();
using (var dataTable = await connection.GetSchemaAsync("MetaDataCollections", cancellationToken))
{ ... /* Logic */ ...}

return (model);
}
Я хочу предоставить синхронную версию этого метода следующим образом:

Код: Выделить всё

public static Model GetModelFromSchema (SqlConnection connection)
{
var model = new Model();
using (var dataTable = connection.GetSchema("MetaDataCollections", cancellationToken))
{ ... /* Logic */ ...}

return (model);
}
Я часто сталкиваюсь с необходимостью сделать это при написании библиотек (хотя и для собственного потребления). Я пишу свои собственные генераторы кода, поэтому для моего сценария важно предоставлять как синхронные, так и асинхронные версии таких методов. По мере увеличения количества методов и строк их кода увеличивается и дублирование логики.
Я видел примеры людей, применяющих следующий подход:

Код: Выделить всё

public static Model GetModelFromSchema (SqlConnection connection)
{
// The asynchronous method is being called synchronously (without `await`).
var task = MsSqlServerAdoSchema.GetSchemaAsync (model1, connection, CancellationToken.None);
var model = task.GetAwaiter().GetResult();

return (model);
}
Здесь два вопроса:
  • Правильно ли реализован третий метод (для вызова async версия при блокировке текущего потока), или мне следует следить за какими-либо ошибками!?
  • В дополнение ко второму и третьему методам, описанным выше, есть ли лучший способ обеспечить синхронность обоих
  • code> и асинхронные версии таких методов без дублирования логики?


Подробнее здесь: https://stackoverflow.com/questions/790 ... ame-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»