2015-06-09 3 views
0

Я начинаю HubConnection. Сначала я получаю новый экземпляр HubConnection, . После этого я создаю новый IHubProxy с именем = «fileHub», настолько хороший.Задание ожидания не выполнено

Моя проблема находится в (или в) ожидаемой функции ContinueWith, я пытаюсь запустить Connection и писать на консоль wheater, начало было успешным или нет. Соединение .Start() успешно и «Подключено» записывается на консоль. Код, добавленный после Console.WriteLine («Connected»), выполнен без проблем.

Но Задача никогда не заканчивается, поэтому класс Client, вызывающий метод HandleSignalRAsync(), ждет завершения неудачно.

Добавление возврата; или task.dispose(); не решает мою проблему.

public static async Task HandleSignalRAsync() 
      { 
       connection = new HubConnection("http://localhost:12754"); 

       myHub = connection.CreateHubProxy("fileHub"); 

       await connection.Start().ContinueWith(
        task => 
        { 
         if (task.IsFaulted) 
         { 
          var ex = task.Exception.GetBaseException(); 
          Console.WriteLine("There was an error opening the connection: {0}", ex); 
         } 
         else 
         { 
          Console.WriteLine("Connected");       
         } 
        }); 

} 

я называю метод с TaskAwaiter в другом классе моего решения:

Functions.HandleSignalRAsync().GetAwaiter().GetResult(); 

называя его:

Functions.HandleSignalRAsync().Wait(); 

не работает, тоже.

+3

Почему вы используете 'ContinueWith', когда вы уже используете' await'? Код после 'await' * является * продолжением. Если вы хотите поймать Исключения, заверните вызов в обработчик исключений –

ответ

2

Но задача никогда не заканчивается

Поскольку оба примера синхронно блокировать, в результате чего ваш код тупиковой. Вы не должны быть blocking on async code.

Вам нужно правильно асинхронно ждать HandleSignalRAsync:

await Functions.HandleSignalRAsync().ConfigureAwait(false); 

Если вы уже используете async-await, нет никаких преимуществ использовать стиль продолжения с ContinueWith, вы можете просто обернуть выполнение в try-catch и await внутри:

try 
{ 
    await connection.Start().ConfigureAwait(false); 
    Console.WriteLine("Connected"); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("There was an error opening the connection: {0}", e); 
}