基本的に、これが起こることです。フォームが表示されている間にバックグラウンド プロセスとして実行されるスレッド (無限ループ) があります。スレッドは、新しい ToolStripMenuItem を追加する必要があるかどうかを確認します。
条件が満たされた場合、UI オブジェクトを作成するために Invoke を使用する必要がありますよね? これに関する問題は、 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);
}
}
}
}