我遇到了带有2个线程的Winforms应用程序的问题:在第二个线程中,我从WCF服务中提取消息。当有消息我需要更新GUI时:我按照How to update the GUI from another thread in C#?中的模式执行此操作。这是代码:
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没有任何细节。你能救我吗?
答案 0 :(得分:0)
试试这个:
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
AddNewTab(id);
});
}
答案 1 :(得分:0)
如果被调用的线程忙于执行某些操作,则调用可能会挂起。 (如果BeginInvoke调用而不是Invoke不会挂起,你可能会知道这种情况。调用阻塞直到调用成功,BeginInvoke没有。)
答案 2 :(得分: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)
如果这无法帮助您诊断问题,我不知道会发生什么。