线程加载正在锁定GUI

本文关键字:锁定 GUI 加载 线程 | 更新日期: 2023-09-27 18:09:17

我的应用程序是一个通信服务器,它从web服务器接收TCP消息,然后将消息重新广播到许多ipad。这是一个c#的windows窗体应用程序。cs创建主表单的一个实例,然后该表单创建四个执行通信工作的线程。有一个线程监听来自web服务器的消息,一个线程将传入消息处理成需要传输的数据,还有一个线程处理发送出站消息。第四个线程进行数据库清理,并花费99%的时间睡觉。

我看到的问题是GUI锁定了加载在系统上。一条传入消息可能代表50或100条传出消息。在测试时,我限制系统一次只能发送5条消息,所以它需要更长的传输时间。发送进程正在使用异步回调,但即使它不是,我也不明白为什么load上的线程会使GUI线程停滞。

我删除了许多从线程到GUI的状态更新的跨线程通信。与GUI通信的模式是:

public void StatusOutput(string myString)
{
    if (this.lbStatus.InvokeRequired)
    {
        this.lbStatus.BeginInvoke(new DebugOutputInvoker(StatusOutput), myString);
    }
    else
    {
        lbStatus.Items.Add(myString);
        while (lbStatus.Items.Count >= 501)
        {
            lbStatus.Items.RemoveAt(0);
        }
        lbStatus.SelectedItem = lbStatus.Items.Count - 1;
}    // StatusUpdate() ...

谁能给我一些建议,如何追求这个?我认为线程与GUI完全隔离,无法加载它。

谢谢!

线程加载正在锁定GUI

作为更新,我删除了所有用于GUI通信的线程,GUI停止锁定。所以这证明它不是GUI线程问题。我遍历线程,直到我发现TCPSender线程具有许多异步回调函数,可能有数百个。当这个线程忙于异步调用时,GUI就会锁定。我怀疑这与线程在处理GUI的一个方法时发生的回调有关。

我已经解决了这个问题,使一个新的线程,只是收集数据从操作线程,然后更新用户界面。被转移到GUI线程上的状态显示的一般状态消息现在被排队,并通过这个新线程更新到GUI。

GUI保持响应,实际上现在似乎能够显示更多的数据。