Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#设置选项卡导致冻结_C# - Fatal编程技术网

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"; ));