0

2 つのスレッドを持つ Winforms アプリに問題があります。2 番目のスレッドで、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

メソッドを次のように置き換えます。

    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 に答える
0

呼び出されたスレッドが何かを実行中の場合、invoke がハングすることがあります。(これは、Invoke の代わりに BeginInvoke 呼び出しがハングしない場合に当てはまります。呼び出しが正常に行われるまで Invoke はブロックしますが、BeginInvoke はそうではありません。)

于 2013-01-16T23:51:02.970 に答える
0

これを試して:

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