Метод GetAwaiter()
У меня есть функция верхнего уровня, как это
var results = await client
.For(x.Offices)
.Select(x.NumberOfFlores, x.Hight)
.QueryAsync();
Клиент - это моя собственная функция, которая делает кучу вещей. (Не то же самое, что класс клиента ODataClient)
Результат QueryAsync()
возвращает пользовательский класс. Этот класс имеет несколько параметров, одним из которых является queryResults. Этот класс имеет GetAwaiter()
функция, которая никогда не работает должным образом.
public async Task GetAwaiter()
{
await queryResults;
}
queryResults
является объектом типа Task<IEnumerable<ODataEntry>>
То, что я хочу сделать, это ждать выполнения queryResults, чтобы я мог использовать его в форме results.QueryResults
Тем не менее, я получаю эту ошибку после "await queryResults"
Невозможно привести объект типа "System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]" к типу "System.Runtime.CompilerServices.INotifyCompletion".
getAwaiter
Функция выполняется, но я получаю сообщение об ошибке, как только вернусь к ней.
Я пробовал кучу разных вещей, но ничего не работает. Что я делаю неправильно?
1 ответ
Task
не ожидающий, это ожидаемое. Это означает, что вы не можете вернуть его из вашего GetAwaiter
метод - это не соответствует договору.
Если вы действительно хотите идти по этому пути (а я действительно не вижу смысла), убедитесь, что ваш GetAwaiter
фактически возвращает официанта:
public TaskAwaiter<IEnumerable<ODataEntry>> GetAwaiter()
{
return queryResults.GetAwaiter();
}
РЕДАКТИРОВАТЬ:
Если вы хотите вернуть задачу другого типа, вам нужно вернуть задачу другого типа - нет никакого способа обойти это. Это пахнет плохим дизайном, но вы можете сделать что-то вроде этого:
public TaskAwaiter<Tuple<YourObject, IEnumerable<ODataEntry>>> GetAwaiter()
{
return
queryResults
.ContinueWith(t => Tuple.Create(this, t.Result))
.GetAwaiter();
}
Это вернет и ваш объект запроса, и результаты в виде двух отдельных свойств кортежа - конечно, вы можете использовать любой другой тип, какой захотите. Тем не менее, я бы по-прежнему настоятельно рекомендовал переосмыслить ваш нынешний дизайн - он выглядит так, как будто через год или два у вас начнутся головные боли.