【问题标题】:SignalR - How to perform async Task in hub?SignalR - 如何在集线器中执行异步任务?
【发布时间】:2013-05-06 10:56:07
【问题描述】:

我正在尝试使用 C# 5 异步/等待功能创建 SignalR 应用程序,但无论何时运行代码,它都会抛出 System.InvalidOperationException。这是重现问题的最简单代码。

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

异常详情:

此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行 Page 时发生此异常,请确保将 Page 标记为 。

堆栈跟踪:

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/await 模式。

【问题讨论】:

  • 您是否尝试过通过在方法名称前添加关键字 async 来使 GetGoogle 方法异步?
  • 是的,我试过了,但是没有用。斯蒂芬的回答终于解决了我的问题。

标签: c# signalr async-await signalr-hub


【解决方案1】:

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

【讨论】:

  • 非常感谢!我花了 2 个晚上试图让它正常工作,但我从来没有想过旧的 WebClient 是罪魁祸首。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多