2013-05-06 41 views
8

我想創建一個使用C#5異步/等待功能的SignalR應用程序,但是無論何時運行代碼,它都會引發System.InvalidOperationException異常。這是最簡單的代碼來重現問題。SignalR - 如何在集線器中執行異步任務?

public class SampleHub : Hub 
{ 
    public Task<string> GetGoogle() 
    { 
     var http = new WebClient(); 
     return http.DownloadStringTaskAsync("http://www.google.com"); 
    } 
} 

異常詳細信息:

異步操作不能在這個時候開始。異步操作只能在異步處理程序或模塊內啓動,或者在頁生命週期中的某些事件期間啓動。如果執行頁面時發生此異常,請確保頁面標記爲<%@ Page Async = \「true \」%>。

堆棧跟蹤:

at System.Web.AspNetSynchronizationContext.OperationStarted() 
at System.Net.WebClient.DownloadStringAsync(Uri address, Object userToken) 
at System.Net.WebClient.DownloadStringTaskAsync(Uri address) 
at System.Net.WebClient.DownloadStringTaskAsync(String address) 

在客戶端,JavaScript的看起來是這樣的。

$.connection.hub.start().done(function() { 
    $('#google').click(function() { 
     var google = sample.server.getGoogle(); 
     console.log(google); 
    }); 
}); 

我做錯了什麼?有沒有解決方法?如果可能的話,我非常希望堅持使用C#中的異步/等待模式。

+0

您是否嘗試通過在方法名稱前添加關鍵字async來使GetGoogle方法異步? – 2013-05-06 19:39:32

+0

是的,我已經試過了,並沒有奏效。斯蒂芬的回答終於解決了我的問題。 – 2013-05-06 22:18:49

回答

10

我會嘗試用HttpClient替換WebClientDownloadStringTaskAsync是對現有的EAP方法的async的一種「螺栓固定」支持,它是SignalR反對的EAP方法。 HttpClient直接使用TAP

+0

非常感謝你!我花了兩個晚上試圖搞定這個工作,並且從來沒有讓我覺得好的舊WebClient是罪魁禍首。 – 2013-05-06 22:17:59