用于线程安全调用的目标UI线程控制

本文关键字:线程 UI 控制 目标 调用 安全 用于 | 更新日期: 2023-09-27 18:16:30

我正在研究线程安全调用,这很困难。我有一个方法,可以帮助我添加一个新的选项卡到tabcontrol,但我想从一个线程调用这个UI不关联。

我当前的选项卡创建代码如下所示。它不是线程安全的。

 TabPage tpage = new TabPage();
 tpage.BorderStyle = System.Windows.Forms.BorderStyle.None;
 //tabcontrol_borwser is the name of the tabcontrol on my ui
 tabcontrol_browser.TabPages.Insert(tabcontrol_browser.TabCount, tpage);

我如何做到这一点,从一个单独的线程,允许我的目标名称相同的控制,存在于主UI线程?

我想远离为每个控件创建线程安全包装类,因为我必须为我创建的每个UI控件这样做,这是多么麻烦!

最简单的逻辑方法是创建一个nameholder,这样做:
PrimaryThread.Control.tabcontrol_browser.TabPages.Insert(tabcontrol_browser.TabCount, tpage);

我有办法这样做吗?

下面是创建选项卡的整个方法:

    private String f_create_new_tab(string tab_name)
    {
        // create a new TabPage object
        tabcontrol_browser.Invoke( () => {
            TabPage tpage = new TabPage();
            tpage.BorderStyle = System.Windows.Forms.BorderStyle.None;

            //add the newly created TabPage
            //to the tabcontrol's collection of tab pages 
            tabcontrol_browser.TabPages.Insert(tabcontrol_browser.TabCount, tpage);
            int count = tabcontrol_browser.TabCount;
            tab_name = count.ToString() + ") " +tab_name;
            tpage.Text = tab_name;
            tpage.Name = tab_name;
            //create a WebBrowser object
            WebBrowser browser = new WebBrowser();
            browser.Name = "browser_" + tab_name;
            browser.Navigate("http://www.google.com");
            WaitBrowserLoading();
            //add the browser object to the tab page 
            //you created previously
            tpage.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
            tabcontrol_browser.SelectTab(tpage);
            //add some event handlers to your browser object
            browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(f_browser_pagechange);
            string browsername = "browser_" + tab_name;
            return browsername;
        });
    }

用于线程安全调用的目标UI线程控制

不确定这是否会对您有所帮助,但任何时候我尝试回调UI线程张贴一些东西或做任何事情的UI我使用这个扩展方法:

   public static class ControlExtensions
   {
      public static void Invoke(this Control Control, Action Action)
      {
         Control.Invoke(Action);
      }
   }

这就是你的情况:

   if(tabcontrol_browser.InvokeRequired())
   {     
      tabcontrol.Invoke( () => {
                                 TabPage tpage = new TabPage();
                                 tpage.BorderStyle = System.Windows.Forms.BorderStyle.None;
                                 tabcontrol_browser.TabPages.Insert(tabcontrol_browser.TabCount, tpage)
                               });
   }