Как использовать wait на методах в интерфейсах
При реализации против интерфейса (из-за насмешек, удалений или аналогичных) с использованием ключевого слова await и интерфейса с методами, возвращающими Task < > :
interface IFoo
{
Task<BigInteger> CalculateFaculty(int value);
}
компилятор обнаруживает ошибку:
Оператор "ожидание" может использоваться только в асинхронном методе. Подумайте о маркировке этого метода с помощью модификатора "async" и измените его тип возврата на "Задача"
Это немного необычно, учитывая, что тип возврата - "Задача". Эта проблема отчасти разочаровывает и заставляет меня "отступать", используя стиль продолжения или предоставляя дополнительный прокси-сервер вокруг этого интерфейса (и, следовательно, почти для каждого интерфейса, который для меня действительно невозможен)
Есть ли у кого-нибудь хорошая идея о том, как это решить?
Ответы
Ответ 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
Сообщение компилятора не используется в интерфейсе. Это асинхронный запрос к задаче, выполняемой средой выполнения, когда соответствующий вызов встречается в операции.
Использование должно выполняться при реализации метода, т.е. класс; использование интерфейса такое же, как и для сеттеров и геттеров в интерфейсе.