SignalR - 如何执行枢纽异步任务?(SignalR - How to perform as

2019-09-02 02:12发布

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

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

异常详细信息:

异步操作不能在这个时候开始。 异步操作只能在异步处理程序或模块内或在在页面生命周期的某些事件来启动。 如果在执行一个页面发生此异常,确保页被标记<%@页异步= \“真\”%>。

堆栈跟踪:

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#中的模式。

Answer 1:

我会尝试更换WebClientHttpClient 。 该DownloadStringTaskAsync是一种“补充”支持async在现有EAP方法,并且它是SignalR被反对的EAP方法。 HttpClient使用TAP直接。



文章来源: SignalR - How to perform async Task in hub?