Преимущества против недостатков: значение bool в списке параметров, чтобы указать асинхронность или нет в C # - PullRequest
0 голосов
/ 14 ноября 2018

Вот обобщенный метод извлечения из таблицы хранилища Azure ( примеры в официальном документе).

    public async Task<T> RetrieveOne<T>(string partitionKey, string rowKey, bool isAsync = false) where T : TableEntity
    {
        // To construct the query operation
        TableOperation retrieveOperation = TableOperation.Retrieve<T>(partitionKey, rowKey);

        // To execute the query
        TableResult result;
        if (isAsync)
        {
            result = await _table.ExecuteAsync(retrieveOperation);
        }
        else
        {
            result = _table.Execute(retrieveOperation);
        }

        // To parse the result
        if (result.Result != null)
        {
            return (T)result.Result;
        }
        else
        {
            throw new Exception("The result retrieved is null");
        }
    }

Я использую isAsync в списке параметров, чтобы указать, является ли этот метод асинхронным или нет. Я сделал это?
Преимущества очевидны: можно легко переключать опции между async или нет.
Кажется, что такой стиль обернул бы и синхронный (isAsync = false) в Task ценой дополнительных затрат, так как выполнение одних только задач также требует времени. Любой другой недостаток?

1 Ответ

0 голосов
/ 14 ноября 2018

Я бы избегал этого .. Короче говоря,

  • В реальных случаях должно быть очень мало вариантов использования, которые гарантировали бы это
  • Это могло бы вызвать взаимные блокировки
  • Это поощряет вас не использовать await и распространять
  • Это добавляет больше ветвления в вашем методе
  • Это добавляет больше сложности при тестировании
  • Обычно пахнет плохо.(IMO)
  • Добавлен FCin , он также генерирует AsyncStateMachine, даже если все вызовы синхронизированы

Примечание: даже запись async и синхронные альтернативытот же метод довольно подозрительный, его сложнее поддерживать и, возможно, указать на другие проблемы дизайна.

Если вы действительно хотите дождаться метода async, позвольте вызывающим сделать это, по крайней мере, это даст им возможность обернуть его, если необходимо, или обработать его соответствующим образом

...