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

相關問題