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

本文关键字:执行 异步 任务 集线器 SignalR- | 更新日期: 2023-09-27 18:12:28

我正试图使用C#5异步/等待功能创建SignalR应用程序,但每当运行代码时,它都会抛出System.InvalidOperationException。以下是重现该问题的最简单代码。

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

异常详细信息:

此时无法启动异步操作。异步操作只能在异步处理程序或模块内启动,或者在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保该页面标记为<%@页面异步=''"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#中的异步/等待模式。

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

我会尝试用HttpClient替换WebClientDownloadStringTaskAsync是对async在现有EAP方法之上的一种"附加"支持,也是SignalR所反对的EAP方法。HttpClient直接使用TAP。