1

このブログに基づいて、Silverlight に SignalR を実装しようとしています: SignalR and Silverlight

.Invoke() を実行しようとすると、ランタイム エラー "System.InvalidOperationException: The Start method must be called before data can send. at Microsoft.AspNet.SignalR.Client.Connection.Send(String data) at Microsoft.AspNet" が表示されます。 .SignalR.Client.Hubs.HubProxy.Invoke[T](String メソッド、Object[] 引数)..."

接続に _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(); で例外をスローしています。

ハブを正しく接続してメッセージを送信するにはどうすればよいですか?

4

1 に答える 1

3

HubConnection.Start非同期です。おそらくまだ状態にあるため、Start直前に電話することはできません。InvokeHubConnectionConnecting

Taskを呼び出す前に、返された fromStartが完了するのを待つ必要がありますIHubProxy.Invoke。を使用してawait(またはTask.ContinueWith.NET 4.5 を実行していない場合)、Start有効にする前に確実に終了させることができbuttonAddます。

AddProductViewファクトリ メソッドでオブジェクトを非同期的に作成することもできます。コンストラクターで呼び出す代わりに、静的メソッドHubConnection.Startでそれを行うことができます。Task<AddProductView> CreateAddProductView()

または、作成が非同期であることを気にしない場合は、同期的AddProductViewに呼び出すことができます。Start

_conn.Start().Wait();
于 2013-03-23T00:30:03.730 に答える