我想創建一個使用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#中的異步/等待模式。
您是否嘗試通過在方法名稱前添加關鍵字async來使GetGoogle方法異步? – 2013-05-06 19:39:32
是的,我已經試過了,並沒有奏效。斯蒂芬的回答終於解決了我的問題。 – 2013-05-06 22:18:49