线程上的加载正在锁定GUI

时间:2015-08-23 22:29:35

标签: c# multithreading tcpclient tcplistener

我的应用程序是一个通信服务器,它从Web服务器接收TCP消息,然后将消息重新广播到许多iPad。它是C#中的Windows窗体应用程序。 Program.cs创建主表单的实例,然后该表单创建四个执行通信工作的线程。有一个线程可以侦听来自Web服务器的消息,一个将传入消息处理成需要传输的数据的线程以及一个处理发送出站消息的线程。第四个线程进行数据库清理并花费99%的时间休眠。

我看到的问题是系统上存在加载的GUI锁定。传入消息可能代表50或100个传出消息。在测试时,我限制他们的系统一次只发送5条消息,因此需要更长的传输时间。发送过程正在使用异步回调,但即使它没有,我也无法理解为什么加载可能会拖延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完全隔离,但无法加载它。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

我已经解决了创建一个刚刚从操作线程收集数据然后更新用户界面的新线程的问题。传输到GUI线程上状态显示的常规状态消息现在排队并通过此新线程更新到GUI。

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