窗体加载线程延迟UI



当我在初始化表单后运行代码时,它按我预期的方式工作。但是,当我在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();
    }

你的线程是旋转,所以他们每个使用整个CPU核心。
这会大大降低系统运行速度。

你不应该像现在这样使用while循环等待。

请等待ManualResetEvent

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

学习编程。比"有用"多一点。这是接近cpu滥用,因为我从来没有见过它的到来。

while (!ABfired)

废话,特别是ABFired不是锁,不是同步的。查找MUTEX做什么,或者ManualResetEvent。你正在循环一个cpu核心,甚至没有确保你有内存屏障,以便线程看到改变的值。

第二,你不能从这些线程返回到UI,而不实际地做一些事情,比如——调用回主线程。

第三,也许形式LAOD不是那么正确的地方?激活表单呢?

第四,三个线程哪个只是玩有趣的游戏?不要用线程来启动,用任务来继续——你重建的东西是我20年来见过的最糟糕的形式。{}

最新更新