2015-06-09 80 views
0

我正在啓動HubConnection。首先我得到一個新的HubConnection實例, 然後我創建了一個名爲=「fileHub」的新IHubProxy,迄今爲止這麼好。任務等待失敗

我的問題是位於(或在)等待函數ContinueWith,我嘗試啓動連接,並寫入控制檯wheater啓動成功與否。 connection.Start()成功並且「連接」被寫入控制檯。 在Console.WriteLine(「已連接」)執行完成後添加的代碼也沒有問題。

但是任務永遠不會結束,所以調用HandleSignalRAsync()方法的Client類等待完成失敗。

添加返回;或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

爲什麼當你已經使用'await'時你使用'ContinueWith'? '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); 
}