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 类创建 2 个线程:acceptClientsThread 和 receiveMessagesThread。接收线程调用 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));

您还可以使用任务并行库 (TPL)。您还可以将事件添加到由专用后台线程处理的ConcurrentQueue。而且还有更多选择。如果没有更多细节,就不可能给出更具体的建议。

于 2012-04-06T18:27:55.807 回答