无法在silverlight客户端打开信号器连接

时间:2013-03-23 00:13:22

标签: c# silverlight signalr

我正在尝试基于此博客在Silverlight中实现SignalR:SignalR and Silverlight

当我尝试.Invoke()时,我收到一个运行时错误“System.InvalidOperationException:必须先调用Start方法才能发送数据。在Microsoft.AspNet.SignalR.Client.Connection.Send(String data)at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke [T](String method,Object [] args)...“

我的连接上有_conn.Start()。如果我再次尝试Start()它,在调用之前,它会抛出异常。这是我的代码:

    private IHubProxy _hub;
    private HubConnection _conn;

    public AddProductView()
    {
        InitializeComponent();
        var url = Application.Current.Host.Source.GetComponents(UriComponents.Scheme | UriComponents.HostAndPort,
                                                                UriFormat.Unescaped);
        _conn = new HubConnection(url);
        _hub = _conn.CreateHubProxy("SilverlightPrism.Mvc.Services.ProductHub");
        _hub.On<string>("NewMessage", message => Deployment.Current.Dispatcher.BeginInvoke(() => DoAddItem(message) ));
        _conn.Start();
    }

    private void DoAddItem(string item)
    {
        var product = DeserializeToProduct(item);
        ProductData.Products.Add(product);
    }

    private void buttonAdd_Click(object sender, RoutedEventArgs e)
    {
        Random random = new Random();
        var id = Guid.NewGuid();
        var product = new Product
            {
                Price = random.Next(1000,100000),
                ProdId = id,
                ProdName = "New prod."
            };
        var jsonMessage = SerializeToJsonString(product);
        _hub.Invoke("SendMessage", jsonMessage);
    }

它在_hub.Invoke();

上抛出异常

如何正确连接集线器并发送消息?

1 个答案:

答案 0 :(得分:3)

HubConnection.Start是异步的。您无法在Start之前致电Invoke,因为您的HubConnection可能仍处于Connecting状态。

您需要等待Task返回的Start完成才能拨打IHubProxy.Invoke。如果您未运行.NET 4.5,则可以使用await(或Task.ContinueWith)以确保Start完成,然后再启用buttonAdd

您还可以在工厂方法中异步创建AddProductView对象。您可以在静态HubConnection.Start方法中执行此操作,而不是在构造函数中调用Task<AddProductView> CreateAddProductView()

或者,如果您不关心创建AddProductView异步,则可以同步调用Start

_conn.Start().Wait();