c# - 调用Invoke挂起程序

标签 c# multithreading invoke begininvoke

基本上,这就是发生的事情。我有一个线程(无限循环),在显示表单时作为后台进程运行。该线程检查是否需要添加新的 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方法永远不会退出:

while (true)

...没有 returnbreak 语句。这将永远挂起 UI 线程。

目前尚不清楚您想要实现什么目标,但您绝对不希望在 UI 线程中像这样循环。我认为你不想在任何线程中以紧密的方式循环,请注意......

关于c# - 调用Invoke挂起程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13776552/

相关文章:

C#:Server.Mappath 如何读取文件?

c# - 从 C# 程序进行打印的最佳方法是什么?

c# - 将 StreamReader 返回到开头

C#重载问题

c# - WPF TPL 重新启动取消的任务

multithreading - 在 Elixir 进程完成之前保持分块连接打开

java - 中断线程时出现 IllegalMonitorStateException

c# - 从另一个线程附加到文本框

c# - 两次调用 Dispatcher.Invoke() 时出现死锁

c# - 调用 EventHandler 泛型,TargetParameterCountException