1

C# で Instant Messenger サーバーを作成する必要があります。サーバーは ConsoleApplication プロジェクトです。そして、3スレッドで動くサーバーを作りたいです。以下のコードで説明します。

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

これはメインのサーバー クラスです。

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);
     }
}

NetServer クラスは、acceptClientsThread と receiveMessagesThread の 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 で実行されます。

上記のコードは疑似コードっぽいです。不明な点があれば教えてください。

4

1 に答える 1

0

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

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

Task Parallel Library (TPL)を使用することもできます。専用のバックグラウンド スレッドによって処理されるConcurrentQueueにイベントを追加することもできます。そして、より多くのオプションがあります。詳細がなければ、より具体的な推奨事項を提示することはできません。

于 2012-04-06T18:27:55.807 に答える