用于线程安全调用的目标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我使用这个扩展方法:
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)
});
}