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

Как использовать wait на методах в интерфейсах

При реализации против интерфейса (из-за насмешек, удалений или аналогичных) с использованием ключевого слова await и интерфейса с методами, возвращающими Task < > :

interface IFoo
{
    Task<BigInteger> CalculateFaculty(int value);
}

компилятор обнаруживает ошибку:

Оператор "ожидание" может использоваться только в асинхронном методе. Подумайте о маркировке этого метода с помощью модификатора "async" и измените его тип возврата на "Задача"

Это немного необычно, учитывая, что тип возврата - "Задача". Эта проблема отчасти разочаровывает и заставляет меня "отступать", используя стиль продолжения или предоставляя дополнительный прокси-сервер вокруг этого интерфейса (и, следовательно, почти для каждого интерфейса, который для меня действительно невозможен)

Есть ли у кого-нибудь хорошая идея о том, как это решить?

4b9b3361

Ответ 1

Сообщение не об интерфейсе, а о вызывающем методе. Вам нужно отметить метод, содержащий ключевое слово await с помощью модификатора async:

public interface IFoo
{
    Task<int> AwaitableMethod();
}

class Bar
{
    static async Task AsyncMethod() // marked as async!
    {
        IFoo x;
        await x.AwaitableMethod();
    }
}

Ответ 2

Это должно быть нормально:

interface IFoo
{
    Task<BigInteger> CalculateFaculty(int value);
}

public class Foo: IFoo
{
  public async Task<BigInteger> CalculateFaculty(int value)
  {
    var res =  await AsyncCall();
    return res;
  }
}

использование:

 public async Task DoSomething(IFoo foo) 
 { 
   var result = await foo.CalculateFaculty(123); 
 }

Ответ 3

Сообщение компилятора не используется в интерфейсе. Это асинхронный запрос к задаче, выполняемой средой выполнения, когда соответствующий вызов встречается в операции.

Использование должно выполняться при реализации метода, т.е. класс; использование интерфейса такое же, как и для сеттеров и геттеров в интерфейсе.