2015-01-19 4 views
-4

Допустим, у меня есть этот код, который вызывает службу и возвращает задачу:Метод возвращает задачу, как получить возвращаемое значение?

public async Task<List<string>> GetList() 
     { 

      client.BaseAddress = new Uri("http://localhost9999/"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpResponseMessage response = await client.GetAsync("api/listofstrings"); 

       var json = response.Content.ReadAsStringAsync().Result; 
       var myStr = JsonConvert.DeserializeObject<List<string>>(json); 
       var list = new List<string>(myStr); 


      return list; 
     } 

Если methpd просто возвращается список строк, я мог бы сделать что-то вроде этого:

var myList = new List<String>(); 
myList = GetList() 

Как может Я получаю аналогичный результат с Задачей? Может, я думаю об этом неправильно? Разумеется, я должен уметь присвоить результат метода (список строк) myList?

+8

Вам нужно «подождать». – SLaks

+0

Точно, 'async' пузыри вверх, вы должны« ждать »на нем в любом месте, которое вы хотите, чтобы оно было реализовано. – Blindy

+1

Это, должно быть, второе, что вы читаете о async/await **, если ** вы читали об этом. – DrKoch

ответ

3

Вы должны использовать await, чтобы получить результат async метода:

var myList = await GetList(); 

Чтобы использовать await метод, который вы называете GetList от должно быть async too.If это не вы можете использовать .Result недвижимость, но это заблокирует выполнение:

var myList = GetList().Result; 
+0

большое спасибо! – Wranglerino

1

Вы await это, как это:

var myList = new List<String>(); 
myList = await GetList(); 

Обратите внимание, что в соответствии с Task-based Asynchronous Pattern, GetList должен иметь Async суффикс, который советы прочь разработчиков, это должно быть await изд:

var myList = new List<String>(); 
myList = await GetListAsync(); 

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

var myList = await GetListAsync(); 
+3

Зачем создавать «Список», чтобы просто выбросить его на следующую строку? –

+0

@EdS: Мой первоначальный код отражает код примера op, чтобы показать минимальное изменение кода, необходимое для понимания базовой концепции 'await'. Позже в моем ответе я указываю, что нет смысла создавать список, который отбрасывается. –

+0

Спасибо за ответ! – Wranglerino

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