Подтвердить что ты не робот

Как использовать async для метода пустого интерфейса

Скажем, у меня есть интерфейс

interface IFoo {
    Task SomeMethodAsync();
}

И я хотел реализовать этот интерфейс, но для одного класса метод пуст.

Должен ли я жить с предупреждением, которое это производит?

async Task SomeMethodAsync() {}

Или мне нужно вернуть некоторую фиктивную задачу?

async Task SomeMethodAsync() { await Task.Run(() => {}); }

Или есть другой вариант?

Также я хочу реализовать этот метод как метод явного интерфейса. Будет ли это иметь значение?

4b9b3361

Ответ 1

Способы, возвращающие Task, не должны быть async.

Я бы рекомендовал что-то вроде этого:

Task IFoo.SomeMethodAsync()
{
  return Task.FromResult(true);
}

Я предполагаю, что если это был синхронный метод, у вас просто было бы пустое тело метода; это эквивалент async пустого тела метода.

Ответ 2

Это зависит только от того, как вы решаете, какие рамки должны обрабатывать такие случаи.

У вас есть, imo, несколько вариантов:

  • вызывает исключение (будет прерывать выполнение, и вы должны каким-то образом обработать его в какой-то мере в цепочке выполнения).

  • return default-value (это может быть решение, предлагаемое вами: просто пустая задача, которая ничего не делает. Плохо, что я вызываю функцию, ожидающую, что она что-то делает, она не сообщает мне о чем угодно, но ничего не делайте. Imo, это плохой дизайн.

  • возвращает некоторый not-valid-value, который перехвачен вызывающим, поэтому вызывающий "знает", что что-то не в порядке.

Ответ 3

Я столкнулся с этим абстрактным базовым классом. Я попробовал метод Стивена Клири, но получал ошибки компилятора в С# 6.

Пример моего базового метода:

protected abstract Task OnFoo(Bar bar);

Это то, что я должен был сделать в моем производном классе:

protected override async Task OnFoo(Bar bar)
{
    await Task.FromResult(true);
}

Проблема с другим ответом заключалась в ключевом слове return во фразе. Поскольку возвращаемое значение Task существенно void, вы ничего не можете вернуть. Кроме того, требуется ключевое слово await.