2016-07-12 20 views
0

私はSignalRクライアントバージョン2.2.0ナゲットを使用しています。C#SignalRクライアント

this._connection = new HubConnection(this._url); 
this._connection.Closed += this.ConnectionOnClosed; 
this._connection.Error += this.ConnectionOnError; 
ServicePointManager.DefaultConnectionLimit = 250; 
this._client = this._connection.CreateHubProxy(HubName); 
this._connection.Start(new WebSocketTransport()).Wait(); 

それから私は、毎回(マルチスレッド)クライアントを再利用:

client.Invoke<bool>(nameof(this.AddIfNotExists), key, data, expireAfter)

Parallel.For(
      0, 
      50000, 
      new ParallelOptions 
      { 
       MaxDegreeOfParallelism = 10, 
      }, 
      async (i) => 
      { 
       var result = await client.ExecuteDistributedAsync(
        (i % 2).ToString(), 
        TimeSpan.FromSeconds(5), 
        async() => 
         { 
          await Task.Delay(500); 
          return $"Done: {i} [{(i % 2)}]"; 
         }); 
       Console.WriteLine("--->" + (result ?? "TIMEOUT:" + i)); 
      }); 

これは、ほとんどすぐに(第一addifnotexist作品をクラッシュし、次の8はクラッシュします)。どこからでも私が読んだことから、IHubProxyはスレッドセーフであるはずです... 何か提案がありますか?

+0

私はこのライブラリを知らないが、私が知っているほとんどのWebクライアントはスレッドセーフではなく、ユーザーあたり1クライアントしかない。 – gismo

+1

「IHubProxyはスレッドセーフであると考えられています」 - プルーフリンクはありますか? – Dennis

+0

それは意味が分かりません。 connection.startが呼び出された後、新しいhubproxyを作成することはできません。これは、クライアントを使うたびにwebsocketが作成されることを意味します。そして、Webクライアントを使用できます。接続を開いたままにすると、より高速になるはずです。 – MrH40XX

答えて

1

解決策はオブジェクトプールを作成することでした。スレッドはオブジェクトプールをプールから取得し、使用したら元に戻しました。 SignalRクライアントはスレッドセーフではありません。

関連する問題