1

我正在使用最新的 SignalR (v:1.1.1),并尝试每隔 3 秒定期简单地调用 Hub 方法。我在这里看到了很多问题并复制了方法,但是GetHubContext方法似乎没有返回该类的正确实例,所以我不能调用该类的方法。您可以通过以下步骤复制案例:

MyHub.cs:

 public class MyHub : Hub
{
    public void SendMessage(string message)
    {
        Clients.All.triggerMessage(message);
    }
}

全球.asax:

  Task.Factory.StartNew(() =>
   {
     while (true)
     {
       var myHub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
       myHub.Clients.All.SendMessage("Hello World");
       System.Threading.Thread.Sleep(3000);
     }
   })
   .ContinueWith(t => { throw new Exception("The task threw an exception", t.Exception); }, TaskContinuationOptions.OnlyOnFaulted);

我认为这很简单。我认为这是正确的做法,但调试器从不点击SendMessage方法。有谁知道我错过了一些非常明显的东西?我只是想安排每 3 秒从服务器调用 SignalR 客户端。

4

2 回答 2

1

我结束了更改集线器的创建方式:

MyHostHub.cs

private readonly MyHost _host;
public MyHostHub(){ _host = new MyHost(); }

我的主机:

 private readonly static Lazy<IHubConnectionContext> _clients = new Lazy<IHubConnectionContext>(() => GlobalHost.ConnectionManager.GetHubContext<MyHostHub>().Clients);
 private IHubConnectionContext Clients
 {
    get { return _clients.Value; }
 }
 public void SendMessage(string message)
 {
    Clients.All.triggerMessage(message);
 }

我的 Global.asax:

            Task.Factory.StartNew(() =>
        {
            while (true)
            {
                var myHost = ObjectFactory.GetInstance<MyHost>();
                myHost.SendMessage();
                Thread.Sleep(3000);
            }
        })
        .ContinueWith(t => { throw new Exception("The task threw an exception", t.Exception); }, TaskContinuationOptions.OnlyOnFaulted);

这似乎工作得很好。基本上我将代码从Hub类移到另一个类,我可以在 Global.asax 中调用它,但我的集线器有一个主机参考。

于 2013-05-30T18:23:29.900 回答
1

在 Global.asax 文件中,当您调用 'myHub.Clients.All.SendMessage("Hello World")' 时,它会向客户端发送一条消息,它不会调用 MyHub 类中的 SendMessage 方法。

请阅读SignalR 文档以查看一些示例

于 2013-05-30T02:38:22.337 回答