每当我设置选定的标签
tcTabs.SelectedTab = secondTab;
整个应用程序冻结,没有任何错误消息。 我该如何解决这个问题?
一些代码
private void downloadThread()
{
WebClient wc;
wc = new WebClient();
lbStatus.Text = "Creating directory";
System.IO.Directory.CreateDirectory("C:\\Program Files\\foo");
pbMain.Value = 33;
Thread.Sleep(1000);
lbStatus.Text = "Downloading files";
wc.DownloadFile("http://website.net/foo.exe", "C:\\Program Files\\foo\\foo.exe");
Thread.Sleep(1000);
pbMain.Value = 66;
lbStatus.Text = "Creating shortcuts";
appShortcutToDesktop("C:\\Program Files\\foo\\foo.exe", "foo");
pbMain.Value = 100;
Thread.Sleep(1000);
tcMain.Width = 186;
tcMain.Height = 122;
this.Width = 186;
this.Height = 122;
tcMain.SelectedTab = tpName;
while (tcMain.SelectedTab != tpAddWebsites)
Thread.Sleep(1000);
tcMain.Width = 218;
tcMain.Height = 147;
this.Width = 218;
this.Height = 147;
}
selectedtab设置为tpName后应用程序的图片 http://segnosis.net/screenshots/b1ktn5.png
答案 0 :(得分:7)
如果您在线程中切换标签,则需要使用Form.Invoke:
void SetSecondTab()
{
tcTabs.SelectedTab = secondTab;
}
void SwitchTabsFromThread()
{
this.Invoke(new Action(() => { SetSecondTab(); }));
}
答案 1 :(得分:0)
由于您似乎坚持看到使用delegate
的答案,那么您可以(如果您的downloadThread代码位于Form
中),只需在您触摸的每个位置执行此类操作用户界面:
BeginInvoke((MethodInvoker)( () => lbStatus.Text = "Creating directory"; ));
答案 2 :(得分:0)
您的主要问题是您正在从我的假设(仅基于方法名称)访问UI元素是非UI线程。你根本做不到这一点。除了主UI线程之外,您不能对任何UI表单或控件执行任何操作;唯一的例外是ISynchronizeInvoke
方法。您将不得不重新考虑应用程序的架构方式并进行一些重大更改。冻结问题只是一个可见的,更广泛问题的症状。