表单加载中的线程滞后于UI

时间:2011-12-09 15:14:36

标签: c# multithreading

当我在表单初始化后运行代码时,它按照我的预期方式工作。但是,当我在form Load事件中第一次加载它时,它会延迟UI绘制一秒钟。我真的不想制作启动画面,因为已经有一些UI元素表明正在完成工作。

volatile bool ABfired = false;
    public form_Main()
    {
        InitializeComponent();
    }

    void GetSearchableDataCache()
    {
        this.UIThread(() =>
        {
            ultraActivityIndicator1.AnimationEnabled = true;
            ultraLabel_Status.Text = "Querying SQL...";
        });

        var projids = new List<string>();
        var names = new List<string>();

        ABfired = false;

        Thread A = (new Thread(() =>
        {
            while (!ABfired)
            {
            }
            projids = new sql.ProjectIDs(true).Get();
        })
        {
            Name = "Thread A", IsBackground = true
        });
        Thread B = (new Thread(() =>
        {
            while (!ABfired)
            {
            }
            names = new sql.names(true).Get();
        })
        {
            Name = "Thread B", IsBackground = true
        });

        Thread AB = (new Thread(() =>
        {
            ABfired = true;
            while (A.IsAlive || B.IsAlive)
            {
            }
            this.UIThread(() =>
            {
                ultraActivityIndicator1.AnimationEnabled = false;
                ultraLabel_Status.Text = "Ready";
            });
        })
        {
            Name = "Thread AB", IsBackground = true
        });

        A.Start();
        B.Start();
        AB.Start();
    }

private void form_Main_Load(object sender, EventArgs e)
    {
        GetSearchableDataCache();
    }

2 个答案:

答案 0 :(得分:3)

您的线程正在旋转,因此它们都会耗尽整个CPU内核 这会大大减慢系统速度。

你永远不应该像现在这样使用while循环 相反,请等待ManualResetEvent

但是,您可以使用Task更简单的实现替换所有代码,而不使用显式线程。
使用Task.ContinueWith将允许您在上一个任务完成后运行任务而不会浪费线程。

答案 1 :(得分:0)

啊 - 学习编程。比“它的作品”多一点。 WHOW - 这已经接近cpu滥用了,因为我见过它。

  

while(!ABfired)

CRAP,特别是因为ABFired不是锁,没有同步。查找MUTEX,或者ManualResetEvent。你想要一个cpu核心,甚至不确定你有什么memroy障碍,以便线程看到更改的值。

其次,你不能从那些线程回到UI而不会做一些事情 - 调用回主线程。

第三,也许形成LAOD并不是正确的地方?激活表格怎么样?

第四,三个线程只是玩有趣的游戏?不要使用线程启动,使用任务,与contiuation - 你重建那些我20年来看到的最糟糕的形式。             {             }