2016-03-31 12 views
0

私は2つのスレッドがサーバプログラム内のある時点に少しずつ異なっていて、どちらも文字列を送信しています。両方のスレッドが文字列を受け取ってから続行するまで、サーバーはこの時点で一時停止します。現在、私はConsole.ReadKey();を使ってスレッドを「一時停止」しています。しかし、これは解決策ではありません。キーを2回(各スレッドごとに1つずつ)押す必要があります。サーバが2つのスレッドを同時に進行する

すべてのスレッドが常にアクセス可能で編集可能なプログラムクラス内にグローバルカウンタを持つ可能性はありますか? ConcurrentDictionaryと同様の概念。こうすることで、どちらのスレッドが最初に文字列を送信したかに基づいてスレッドを区別し、両方のクライアントが「回答済み」であるとカウンタが満足されるまでプログラムをハングアップさせることができます。

class Program 
{ 
    public static bool isFirstThread = false; 

    static void Main(string[] args) 
    { 
     runServer(); 
    } 

    static void runServer() 
    { 
     //server setup 
     Thread[] threadsArray = new Thread[2]; 
     int i = 0; 
     try 
     { 
      while(true) //game loop 
      { 
       Socket connection; 
       connection = listener.AcceptSocket(); 
       threadRequest = new Handler(); 

       if(i==0) //first thread 
       { 
        threadsArray[i] = new Thread(() => threadRequest.clientInteraction(connection, true); 
       } 
       else //not first thread 
       { 
        threadsArray[i] = new Thread(() => threadRequest.clientInteraction(connection, false); 
       } 

       threadsArray[i].Start(); 
       i++; 
      } 
     } 

     catch(Exception e) 
     { 
      Console.WriteLine("Exception: " + e.ToString()); 
     } 
    } 
} 


class Handler 
{ 
    public void clientInteraction(Socket connection, bool isFirstThread) 

    { 
     string pAnswer = string.Empty; 
     //setup streamReaders and streamWriters 

     while(true) //infinite game loop 
     { 
      //read in a question and send to both threads. 
      pAnswer = sr.ReadLine(); 
      Console.WriteLine(pAnswer); 

      Console.ReadKey(); //This is where I need the program to hang 

      awardPoints(); 

     } 
    } 
} 

これは私が見逃しているエラーにある物事のカップルがあるかもしれないので、質問の肥大化を避けるために、かなりのみじん切りましたが、私のコードが何をしているかの目安です。

私は、理論上、質問文字列がサーバーから送信されたときからタイマーを設定することができましたが、私はこの段階ではなくなりました。

ご意見やご指摘をいただければ幸いです。前もって感謝します。

+0

条件とwhileループのようrunServer()でそれを初期化?変数は通常、競合条件が実行されるときを除いて、複数のスレッドによって編集可能です。しかし、待機したい場合は、whileループをブール条件で使用します。 –

+0

この変数はどこで宣言されますか?私はプログラムクラスに入れて実験しましたが、スレッドが作成されたときにそれを渡さないと、それは動作しません。スレッドが作成された時点で、提案されたwhileループの条件はわかりません – James

+0

両方のスレッドを同時に、または1つだけ継続したいですか?あなたはいつも変数を 'ref'パラメータとして渡すことができます... –

答えて

2

この正確な目的のために設計されたSystem.Threading.Barrierを使用します。つまり、スレッドグループ内の各スレッドをすべて計算に移るまで待ちます。

Barrier barrier = new Barrier(2); 

、各スレッドの最後で次の操作を行います:

barrier.SignalAndWait(); 
+1

これについて知りませんでした。ニース! –

+1

は絶対完璧です。とても有難い。 – James

+0

:-) - 'System.Threading'にはたくさんのおいしさがあります。別のスレッドが別のスレッドにシグナルを送るまで、あるスレッドを待つための' AutoResetEvent'が別の好みです。 –

関連する問題