2013-03-23 63 views
1

我想在Silverlight上基於此博客實現SignalR:SignalR and Silverlight。當我嘗試.Invoke()我得到一個運行時錯誤「System.InvalidOperationException:在數據可以發送之前必須調用啓動方法。在Microsoft.AspNet.SignalR.Client.Connection.Send(字符串數據)在Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke [T](字符串方法,對象[]參數)...「無法在Silverlight客戶端打開信號連接器

我有_conn.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();

如何正確獲取集線器連接併發送消息?

回答

3

HubConnection.Start是異步的。您不能在Invoke之前撥打Start,因爲您的HubConnection可能仍處於Connecting狀態。

您需要等待從Start返回的Task完成後才能撥打IHubProxy.Invoke。如果您未運行.NET 4.5,則可以使用await(或Task.ContinueWith)確保Start完成後再啓用buttonAdd

您也可以在工廠方法中異步創建AddProductView對象。不要在構造函數中調用HubConnection.Start,您可以在靜態方法中使用Task<AddProductView> CreateAddProductView()

另外,如果你不關心你的創作是AddProductView異步的,你可以叫Start同步:

_conn.Start().Wait(); 
+0

謝謝你,讓我感動着看到,我認爲錯誤是越來越吞噬, 找不到服務器。一旦我修復了網址,我應該開展業務。 – Steve 2013-03-23 23:05:38