WinForms应用程序在调用其他线程的委托后挂起
本文关键字:挂起 线程 应用程序 调用 其他 WinForms | 更新日期: 2023-09-27 17:53:39
我有一个问题与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没有任何细节。你能帮我吗?
试试这个:
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
AddNewTab(id);
});
}
如果被调用的线程忙于做某事,则调用可能会挂起。(如果调用BeginInvoke而不是调用Invoke不会挂起,你就可以知道这种情况。调用阻塞,直到调用成功,BeginInvoke不会)
将你的方法替换为:
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);
}
}
确保您可以在您的环境中找到调试器输出。(见鬼,使用控制台。WriteLine(如果有帮助的话)
如果这不能帮助你诊断问题,我不知道什么会。