C#设置选项卡导致冻结

时间:2011-05-19 19:46:59

标签: c#

每当我设置选定的标签

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

3 个答案:

答案 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方法。您将不得不重新考虑应用程序的架构方式并进行一些重大更改。冻结问题只是一个可见的,更广泛问题的症状。