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中。

上面的代码是pseudocode-ish。如果有任何ambigous请让我知道。

回答

0

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

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

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

+0

感谢它的工作。 – dburner 2012-04-10 19:42:48

相关问题