在另一个线程中调用/调用偶数

时间:2012-04-06 18:06:31

标签: c# multithreading events network-programming console-application

我必须在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中运行。

上面的代码是伪代码。如果有什么不明确的请告诉我。

1 个答案:

答案 0 :(得分:0)

根据您的要求,将HandleMsg调用移动到不同的线程有很多种不同的方法。最简单的方法是使用ThreadPool在不同的线程上引发NewNetMsg事件:

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

您也可以使用Task Parallel Library (TPL)。您还可以将事件添加到由专用后台线程处理的ConcurrentQueue。还有更多选择。没有更多细节,就不可能提出更具体的建议。