2014-10-12 32 views
1

我使用了一個組件在C#中的套接字連接如何從事件退出線程模式

我通過線程連接10個tcp對象到服務器。 和我在一個事件recived數據(Data_OnRecived)

這裏是我的代碼:

//連接功能

private void Connect(object State) 
    { 
     Tcp tcp = (Tcp)State; 
     TcpSession tcpSession = new TcpSession(); 

     tcpSession.RemoteEndPoint = new Dart.Sockets.IPEndPoint(IP, Convert.ToInt32(Port)); 
     tcpSession.ConnectTimeout = 1; 

     try 
     { 
      tcp.Connect(tcpSession); 
     } 

     catch(System.Net.Sockets.SocketException ex) { 
      tcp.Marshal(ex); 
     } 
    } 

//初始TCP組件

private void TcpInitialize() 
    { 
     for (int i = 0; i < MaxConnection; i++) 
     { 
      SocketControl[i].TCPConnection = new Tcp(); 

      SocketControl[i].TCPConnection.Data += new System.EventHandler<Dart.Sockets.DataEventArgs>(this.tcp_Data); 

      SocketControl[i].TCPConnection.Start(Connect, SocketControl[i].TCPConnection); 

      SocketControl[i].TCPConnection.Tag = i; 
     } 
    } 

和TCP_Data數據收集時觸發的事件處理程序:

void tcp_Data(object sender, Dart.Sockets.DataEventArgs e) 
     { 
      TCP tcp = (TCP) Sender; 
      int GlobalVariable = tcp.Tag; 
     } 

我的問題是在這裏,tcp_Data將以線程模式運行,而不是在Queque中並逐個運行。我可以改變它,這個事件不會在線程模式下啓動?我的意思是每個收到的數據,在另一個數據後觸發tcp_Data。

感謝任何幫助

回答

1

你想在同一時間只能執行一個tcp_Data回調。使tcp_Data執行此同步。例如,它可能需要一個鎖:

object lockObj = new object(); 
    void tcp_Data(object sender, Dart.Sockets.DataEventArgs e) 
    { 
     lock (lockObj) { 
      TCP tcp = (TCP) Sender; 
      int GlobalVariable = tcp.Tag; 
      //... 
     } 
    } 

你也可以排隊這項工作的TaskScheduler that is single-threaded

+0

@urs它沒有改變任何事情。當我調試這段代碼時,我可以看到它在線程模式下執行。 – Elahe 2014-10-12 09:03:11

+0

「線程模式」是什麼意思?你的陳述與這個答案有什麼關係? – usr 2014-10-12 09:17:46

+0

我希望tcp_Data中不能有多於一個線程。 – Elahe 2014-10-12 10:05:26