如何从线程模式中触发事件

时间:2014-10-12 08:14:59

标签: c# multithreading events

我在C#

中使用了一个用于套接字连接的组件

我通过线程将10个tcp对象连接到服务器。 我在事件(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 个答案:

答案 0 :(得分: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