【发布时间】:2012-12-08 10:19:22
【问题描述】:
基本上,这就是发生的事情。我有一个线程(无限循环),在显示表单时作为后台进程运行。该线程检查是否需要添加新的 ToolStripMenuItem。
如果满足条件,我需要使用 Invoke 来创建 UI 对象,对吗?问题是,当调用 this.Invoke 或 BeginInvoke 时,表单变得无响应,而执行检查的线程仍然运行良好。有什么想法吗?
这是我第一次尝试使用这个多线程的东西。我确定我错过了一些东西。
public void ThreadSetCom()
{
while (true)
{
string[] tmpStrPort = System.IO.Ports.SerialPort.GetPortNames();
IEnumerable<string> diff = tmpStrPort.Except(strPort);
strPort = tmpStrPort;
System.Console.WriteLine(System.IO.Ports.SerialPort.GetPortNames().Length);
foreach (string p in diff)
{
var cpDropdown = (ToolStripMenuItem)msMenu.Items["connectToolStripMenuItem"];
cpDropdown = (ToolStripMenuItem)cpDropdown.DropDownItems["connectReaderToolStripMenuItem"];
ToolStripMenuItem tsmi = new ToolStripMenuItem();
tsmi.Text = p;
tsmi.Name = p;
tsmi.Click += new EventHandler(itm_Click);
if (this.msMenu.InvokeRequired)
{
GUIUpdate d = new GUIUpdate(ThreadSetCom);
this.Invoke(d);
}
else
{
cpDropdownList.DropDownItems.Add(tsmi);
}
}
}
}
【问题讨论】:
-
我们需要更多细节——理想情况下是一个简短但完整的程序来演示问题。您调用的代码到底是什么样的?
-
嗨,乔恩,我正在尝试调用上述方法 ThreadSetCom。委托 GUIUpdate 只会回调它所在的方法。我不确定这是否是更新 UI 的正确方法。我见过很少的样本可以做到这一点,所以我只是在尝试。简而言之,这个方法是在表单构造函数中调用的。就是这样。没什么。但它不起作用。你注意到什么问题了吗?
-
请说明您是如何启动子线程的。你在某处打电话给
Join吗?
标签: c# multithreading invoke begininvoke