2014-09-08 2 views
11

Я хочу сделать запрос на веб-сервис asynchron. Я называю это здесь:Список возвратов от метода async/await

List<Item> list = GetListAsync(); 

Вот декларация моей функции, которая должна возвращать список:

private async Task<List<Item>> GetListAsync(){ 
    List<Item> list = await Task.Run(() => manager.GetList()); 
    return list; 
} 

Если я хочу, чтобы скомпилировать я получаю следующее сообщение об ошибке

Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List<Item>> to System.Collections.Generic.List<Item> 

Как я знаю. Если я использую модификатор async, результат автоматически завершается с помощью задачи. Я думаю, что этого не происходит, потому что я использую Task.Run. Если удалить Task.Run(() => части я получаю

Не может дождаться System.Collections.Generic.List выражения:

Я думаю, что я не до конца понял асинхра/ждут метод. Что я делаю неправильно?

+0

возможно дубликат [Невозможно неявно преобразовать тип из Task <>] (HTTP: // StackOverflow. com/questions/12886559/can not-implicitly-convert-type-from-task) – i3arnon

ответ

27

Вы должны исправить свой код, чтобы ждать, пока в списке для загрузки:

List<Item> list = await GetListAsync(); 

Кроме того, убедитесь, что метод, в котором находится этот код, имеет async модификатор.

Причина, по которой вы получаете эту ошибку, заключается в том, что метод GetListAsync возвращает Task<T>, который не является завершенным результатом. Поскольку ваш список загружается асинхронно (из-за Task.Run()), вам нужно «извлечь» значение из задачи, используя ключевое слово await.

Если удалить Task.Run(), вы список будет загружен синхронно и вам не нужно использовать Task, async или await.

Еще одно предложение: вам не нужно ждать в GetListAsync метода, если единственное, что вам сделать, это просто делегирует операцию другого потока, так что вы можете сократить свой код на следующее:

private Task<List<Item>> GetListAsync(){ 
    return Task.Run(() => manager.GetList()); 
} 
+0

Им также необходимо убедиться, что метод, вызывающий этот код, выполнен как метод async (если он еще не установлен). –

+0

Что я не понимаю, почему я должен «ждать» два раза? – testing

+0

@testing, вам нужно ждать дважды, потому что у вас есть 2 асинхронных вызова –

7

В дополнение к ответу @ takemyoxygen соглашение о наличии имени функции, которое заканчивается на Async, заключается в том, что эта функция действительно асинхронна. То есть он не запускает новый поток, и он не просто вызывает Task.Run. Если это весь код, который находится в вашей функции, это будет лучше, чтобы удалить его полностью и просто:

List<Item> list = await Task.Run(() => manager.GetList()); 
+0

У меня также есть блок try/catch, чтобы поймать исключения, и я показываю счетчик , Итак, мое имя метода правильное, чем? – testing

+0

да, я думаю, что все должно быть ОК, начало нового потока не идеально, но я думаю, что руководство больше касается вызова синхронной версии функции внутри 'Task.Run' –

Смежные вопросы