【问题标题】:How to fire event out of threading mode如何从线程模式中触发事件
【发布时间】:2014-12-07 00:36:56
【问题描述】:

我在 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 将在线程模式下运行,而不是在队列中并一一运行。我可以更改此事件不以线程模式启动吗?我的意思是每一个接收到的数据,一个接一个地触发 tcp_Data。

感谢您的帮助

【问题讨论】:

    标签: c# multithreading events


    【解决方案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

    【讨论】:

    • @urs 它没有改变任何东西。当我调试这段代码时,我可以看到它是在线程模式下执行的
    • “线程模式”是什么意思?你的陈述与这个答案有什么关系?
    • 我为您提供了解决方案。你怎么看?
    • 现在你的代码在 tcp_Data 事件处理程序中有更多的线程。 @urs 我可以和你聊聊这个问题吗?我想解释清楚...
    • 锁体只对特定的锁对象实例是独占的。如果您使用多个实例,那么您的代码将专门运行每个锁对象实例。这就是锁定对象参数的for
    猜你喜欢
    • 2014-04-01
    • 2016-11-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多