1

C#でInstant Messengerサーバーを作成する必要があります。サーバーはConsoleApplicationプロジェクトです。そして私は3つのスレッドで動作するサーバーを作りたいと思っています。私は以下のコードで説明します。別のスレッドでも呼び出し/呼び出し

質問は、別のスレッドから関数を呼び出す方法、または別のスレッドでイベントを作成する方法です。

これはメインサーバークラスです。 acceptClientsThreadとreceiveMessagesThread:

public class GiNetServer 
{ 
    public void Start() 
    { 
     netServer = new NetServer(); 
     msgHandler = new NetMsgHandler(); 

     netServer.NewNetMsg += msgHandler.HandleMsg; 

     Work(); 
    } 

    private void Work() 
    { 
     while(true) //This runs in the MainThread 
      sleep(1); 
    } 
} 

ネットサーバークラスは、2つのスレッドを作成します。 受信スレッドはNewNetMsgを呼び出します。

public class NetServer 
{ 

    public event NewNetMsgEventHandler NewNetMsg; 

    public NetServer() 
    { 
      acceptClientsThread = new Thread(ListenForClients); 
      receiveMessageThread = new Thread(Receive); 
      //and of course starts them here... 
    } 

    private void Receive() 
    { 
      while(true) 
      { 
       Heartbeat(); 
      } 
    } 

    private void Heartbeat() 
    { 
      foreach(netClient in clientsList) 
      { 
       if (netClient.DataAvalible) 
       { 
        netClient.Recive(); 
       } 
       if (!netClient.IsBufferEmpty()) 
       { 
        nextMsg = netClient.NextMessage(); 
        if (nextMsg != null) 
         NewNetMsg(netClient, nextMsg); //Call the event! 
       } 
      } 
    } 
} 

msgHandler.HandleMsg関数を別のスレッドまたはMainThreadで実行させるにはどうすればよいですか?

このように、HandleMsgはreceiveMessagesThreadで実行されます。

上記のコードは擬似コードです。あいまいなことがあれば教えてください。

答えて

0

HandleMsg呼び出しを別のスレッドに移動するには、要件に応じてさまざまな方法があります。最も簡単な方法は、ThreadPool使用して別のスレッドでNewNetMsgイベントを発生させるために、次のようになります。

ThreadPool.QueueUserWorkItem(s => NewNetMsg(netClient, nextMsg)); 

またTask Parallel Library (TPL)を使用することができます。専用のバックグラウンドスレッドによって処理されるConcurrentQueueにイベントを追加することもできます。さらに多くのオプションがあります。詳細がなければ、より具体的な勧告をすることは不可能です。

+0

ありがとうございました。 – dburner

関連する問題