C#设置选项卡导致冻结
每当我设置所选选项卡时C#设置选项卡导致冻结,c#,C#,每当我设置所选选项卡时 tcTabs.SelectedTab = secondTab; 整个应用程序冻结,没有任何错误消息。 我怎样才能解决这个问题 一些代码 private void downloadThread() { WebClient wc; wc = new WebClient(); lbStatus.Text = "Creating directory"; System.IO.Directory.
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;
}
所选选项卡设置为tpName后的应用程序图片
如果要在线程中切换选项卡,则需要使用:
由于您似乎坚持要看到使用
委托的答案,因此您可以(如果您的下载线程代码在表单中
)在触摸UI的每个位置执行以下操作:
BeginInvoke((MethodInvoker)( () => lbStatus.Text = "Creating directory"; ));
您的主要问题是,您正在从我假定的(仅基于方法名)非UI线程访问UI元素。你根本无法做到这一点。除了主UI线程外,您不能从线程对任何UI窗体或控件执行任何操作;唯一的例外是ISynchronizeInvoke
方法。您将不得不重新考虑应用程序的架构,并进行一些重大更改。冻结问题只是更广泛问题的一个明显症状。似乎第二个选项卡构造函数(或初始化时调用的smth)中有错误的代码。这件事没什么可说的。试着一步一步地只分析第二个tab代码(没有tabcontrol和其他东西);可能你有一个无限循环,第二个标签可以正常工作大约1秒。我在一个线程中切换选项卡。确保你正在操作的线程是UI线程。我想回应@ROBOlav的评论,因为你说你在一个线程中切换选项卡,你必须执行上面在UI线程中列出的代码。如果你在另一个线程上,那么你需要使用Invoke
或BeginInvoke
调用来运行UI线程中的代码。伙计,我们为pointnuts工作,我们得到的只是一记耳光。
BeginInvoke((MethodInvoker)( () => lbStatus.Text = "Creating directory"; ));