2014-10-12 31 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