2015-05-15 13 views
-1

У меня есть стек вызовов в веб-api, который нужно вызывать асинхронно. Я никогда не использовал aysnc.Не получать зависание TASK и WAIT в C#

Я создал простую программу испытаний консоли, вдоль линий:

class Program 
{ 
    static void Main(string[] args) 
    { 
     ClassOne xx = new ClassOne(); 
     var v1 = xx.DummyTask(); 
    } 
} 

С класса определяется как:

namespace GHTest.classes 
{ 
    public class ClassOne 
    { 
     GitHubClient client; 

     public ClassOne() 
     { 
      client = new GitHubClient(new ProductHeaderValue("OMHSite")); 
     } 

     public async Task<string> DummyTask() 
     { 
      Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror"); 
      task.Wait(); 

      var myResult = task.Result; 
      return myResult.FullName; 
     } 
    } 
} 

визуальных состояний Studio, я должен использовать оператор «ждать», как в настоящее время этот код будет работать синхронно. Где работает оператор ожидания?

Кроме того, если следующий оператор генерирует исключение, как я ловлю, что в задаче

client.Repository.Get("openEHR", "CKM-mirror"); 
+0

Предполагая, что вы искали что-то вроде https://www.bing.com/search?q=c%23+async+console ваш код выглядит странно ... Пожалуйста, обновить свой пост со ссылками вы» вы привыкли узнавать об использовании 'async' /' await' в консольных приложениях, чтобы было легче понять, чего вы не знаете или не нуждаетесь в помощи. –

ответ

5

task.Wait(); является redudant, вызов task.Result будет ждать в неявном виде.

Вот ваш метод, переписанный для использования await.

Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror"); 
var myResult = await task; 

return myResult.FullName; 

Вам не нужно .Result либо как тип await на Task<T> является T.

По вопросу обработки исключений вам нужно будет сделать try/catch вокруг await (или Result в исходном коде). Так будет, когда исключение будет восстановлено. Обратите внимание, что это верно только в том случае, если исключение выбрано в Task, теоретически сама функция Get может выбросить, которую нужно было бы поймать там.

Также обратите внимание, что, поскольку вы возвращаете async, вы можете выбрать исключение, где бы вы ни находились await (или Result).

И, наконец, не забывайте, что если вы не сделали await результат DummyTask, ваша задача может быть неполной (или Result).

static void Main(string[] args) 
{ 
    ClassOne xx = new ClassOne(); 
    var v1 = xx.DummyTask(); 
    var resultV1 = v1.Result; //Forces the execution of v1 by requesting its result. 
} 
+0

Я изменил код, как было предложено удалить task.Wait(); Когда вызывающие программы получают ответ от метода, задача все еще ожидает активации, даже если оператор «ожидание» был добавлен. Если я добавляю task.Wait(); назад, затем он работает. –

+2

@BENBUNCoder Вы также должны «ждать» или «ждать»() 'результат' DummyTask() '; то есть в вашем 'static void Main (string [] args)' вам нужно сделать: 'ClassOne xx = new ClassOne(); Задача Задача = xx.DummyTask(); task.Wait(); var v1 = task.Result; ЕЫпе (v1); '. –