0

我有 2 个线程的 Winforms 应用程序问题:在第二个线程中,我从 WCF 服务中提取消息。当有消息时我需要更新 GUI:我按照此处找到的模式执行此操作如何从 C# 中的另一个线程更新 GUI?. 这是代码:

     private delegate void CWU(int ID); 
    public void AddNewTab(int id)
    {
        if (this.tabControl1.InvokeRequired)
        {
            CWU cb = new CWU(AddNewTab);
            this.tabControl1.Invoke(cb,id);
        }
        else
        {
            User ToChatWith = ContactsHelper.AllFriends.Find(e => e.ID == id);
            tabpage.Text = ToChatWith.ToString();
            this.tabControl1.TabPages.Add(tabpage);
            this.tabControl1.SelectTab(tabpage);
        }

选项卡已正确添加,当我们离开此方法时,应用程序没有响应,调试中没有信息。当我在添加此选项卡后运行我的应用程序时,我得到 AppHangB1 没有任何详细信息。你能帮助我吗?

4

3 回答 3

0

如果被调用线程忙于做某事,调用可能会挂起。(如果 BeginInvoke 调用而不是您的 Invoke 不会挂起,您可能会知道这种情况。Invoke 会阻塞,直到调用成功,BeginInvoke 不会。)

于 2013-01-16T23:51:02.970 回答
0

尝试这个:

if (this.InvokeRequired)
{
    this.Invoke((MethodInvoker)delegate
    {
        AddNewTab(id);
    });
}
于 2013-01-16T21:57:05.530 回答
0

用这个替换你的方法:

    private void dbg(string s)
    {
        System.Diagnostics.Debug.WriteLine("AddNewTab({0}): {1}", 
            Thread.CurrentThread.ManagedThreadId, s);
    }
    public void AddNewTab(int id)
    {
        try
        {
            dbg("entered");
            if (this.tabControl1.InvokeRequired)
            {
                new Thread(delegate() { try {
                        CWU cb = new CWU(AddNewTab);
                        dbg("calling Invoke");
                        this.tabControl1.Invoke(cb, id);
                        dbg("Invoke returned");
                    } catch (Exception ex) { dbg("" + ex); }
                }).Start();
                dbg("created sub-thread");
            }
            else
            {
                dbg("setting tabpage.Text");
                User ToChatWith = ContactsHelper.AllFriends
                    .Find(e => e.ID == id);
                tabpage.Text = ToChatWith.ToString();
                dbg("adding tab");
                this.tabControl1.TabPages.Add(tabpage);
                this.tabControl1.SelectTab(tabpage);
                dbg("done adding tab");
            }
            dbg("leaving");
        }
        catch (Exception ex)
        {
            dbg("" + ex);
        }
    }

确保您可以在您的环境中找到调试器输出。(见鬼,如果有帮助,请使用 Console.WriteLine)

如果那不能帮助您诊断问题,我不知道会怎样。

于 2013-01-17T15:31:25.870 回答