SignalR - 如何在集线器中执行异步任务?

SignalR - 如何在集线器中执行异步任务?

问题描述:

我想创建一个使用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

我会尝试用HttpClient替换WebClientDownloadStringTaskAsync是对现有的EAP方法的async的一种“螺栓固定”支持,它是SignalR反对的EAP方法。 HttpClient直接使用TAP

+0

非常感谢你!我花了两个晚上试图搞定这个工作,并且从来没有让我觉得好的旧WebClient是罪魁祸首。 – 2013-05-06 22:17:59