2016-08-24 4 views
0

私は自分が持っている問題についてどうやって行くのかについて意見を出したいと思っていました。既存のワーカー/タスクに接続しますか?

私はサーバーとクライアントを持っています。

クライアントAが接続してのは

クライアントBが接続し、1レッツ・コールに9999からカウントダウンし、別のスレッドを生成するためにサーバーを要求するこのスレッドAを呼ぶことにしましょう9999までの1から数えて新しいスレッドを生成するためにサーバーを要求しますこのスレッドB.

スレッドAは、呼び出し側クライアントに現在のカウントに関する更新を送信します(つまり、スレッドAはクライアントAを更新し、スレッドBはクライアントBを更新します)。

クライアントAが切断されて再接続されます - 私の質問は、現在のスレッドにどのように「再登録」して更新を入手するのですか?

このようなタスクを支援する既存のライブラリはありますか?

UPDATE:もう少し明確化、それは場合に役立ちます:

これらのサーバスレッドがバックグラウンドで継続的に実行されます。例えば、クライアントがサーバに接続してタスクを開始する - このタスクはメッセージをクライアントに返送する。ユーザーは、クライアントがメッセージを受信して​​いる間にタスクが開始されたことを知っています。ユーザーはクライアントを切断しますが、タスクはまだバックグラウンドで処理中です。ユーザーは、タスクを確認してクライアントを再起動し、サーバーに接続するようにします。最後の文は私が達成しようとしているものです。私の謝罪は明らかではない。

+0

なぜ同じスレッドを購読する必要がありますか?サーバーに接続している多数のクライアントが、サーバーが完全に応答しなくなるほどのスレッドを生成する場合はどうなりますか? – galenus

+0

私は達成しようとしているものの例を使用しようとしていたと思います.-基本的には「タスク」に再登録し、更新を継続します。 – TotalApproved

+0

あなたのアーキテクチャーはスレッドに依存しません。すなわち、各スレッド(例えば、スレッドプールからの)は、前のスレッドが残したポイントから作業を選択し、処理を続けることができなければならない。しかし、あなたの質問には詳細があまりにも少ないです。たとえば、サーバースレッドにはどのような種類の作業負荷が割り当てられていますか?クライアントが接続したときにのみ処理されているのでしょうか、それとも連続バックグラウンド処理ですか? – galenus

答えて

1

はあなたの問題を解決するために、これを試してみてください。

がサーバーにnoticicationを与える を切断したときに作成し、最初に接続し、エヴェーレに再接続している間、サーバーに送信されたGUIDで「認証」。

サーバーはGUIDを取得してリストに保持し、サーバーがGUIDを取得するたびに既存のエントリを検索し、エントリがある場合はクライアントが既に接続されていることを認識します。そうでない場合、クライアントは接続されていないので、サーバーは新しいスレッドを作成する必要があります。

代わりのGUIDあなたはこれを行うことができるものの抽象例である(などMAC、ハードウェアをチェックサム、など)他のすべてのユニークなID

0

を使用することができます。質問で具体的なAPIを指定していないので、私は作成された名前とクラスを使用します。

クライアントを識別するために、固有の識別トークンを使用します。ClientTokenとしましょう。トークンは、最初のクライアント接続に割り当てられます。さらに認証のためにクライアントに返され、タスクトラッキングの処理にもサーバーによって使用されます。

追跡部分は、トークンからタスクデータまでの辞書です。タスクデータは、タスクとそのメッセージのキューのペアです:

private readonly ConcurrentDictionary<ClientToken, TaskData> m_tasks; 

class TaskData 
{ 
    public Task ProcessingTask { get; set; } 
    public BlockingCollection<Message> TaskMessages { get; } = 
     new BlockingCollection<Message>(); 
} 

たとえば、ClientAはサーバーに何らかの手段で接続しているとします。あなたがMessages容量とその項目寿命を決定してください

//this is a kind of event handler, we should'n 'await' on it 
async void OnClientConnectedAsync(Client client) 
{ 
    var token = client.GetToken(); 
    TaskData taskData; 
    if (token != null && m_tasks.TryGetValue(token, out taskData)) 
    { 
     await ProcessMessagesAsync(taskData); 
    } 
    else 
    { 
     taskData = new TaskData(); 
     token = GenerateUniqueTokenBasedOnTheClientParameters(client); 
     await client.SetTokenAsync(token); 

     if (m_tasks.TryAdd(token, taskData)) 
     { 
      taskData.ProcessingTask = 
       InitProcessingTask(
        taskData.Messages, //will be used by the 
        client); 

      await ProcessMessagesAsync(taskData); 
     } 
    } 
} 

async Task ProcessMessagesAsync(TaskData taskData) 
{ 
    while (client.IsConnected) 
    { 
     var message = taskData.Messages.Take(); 
     await client.SendAsync(message); 
    } 
} 

:接続の世話をする部分は次のようになります。

関連する問題