我有一个程序需要10到20秒才能启动。程序启动时,我需要显示一个带有进度条的窗口。我知道BackgroundWorker是执行此操作的正确方法,但是很遗憾,我现在没有时间使用线程对整个gui进行重做。这是我正在尝试的一些代码,但无法正常工作。谁能帮忙..?

using System;
using System.Threading;
using System.Windows;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            Thread t = new Thread(ShowLoadingWindow);
            t.SetApartmentState(ApartmentState.STA);
            t.Priority = ThreadPriority.Highest;
            t.Start();

            DoSomeLongTask();
            keepLooping = false;
        }

        bool keepLooping = true;
        private void ShowLoadingWindow()
        {
            LoadingWindow lw = new LoadingWindow();
            lw.Show();

            while (keepLooping)
            {
                Thread.Sleep(1);
            }

            lw.Close();
        }

        private void DoSomeLongTask()
        {
            for (int i = 0; i < 20000; i++)
            {
                GC.Collect();
            }
        }
    }
}


加载窗口只是带有进度条的裸窗口。这怎么不起作用?

最佳答案

您仍在主线程中完成很长的任务。您需要在主线程中显示加载窗口,并在后台执行冗长的任务。

实际上,使用BackgroundWorker是最简单的解决方案:

BackgroundWorker bw;
LoadingWindow lw;

公共Window1(){
    bw = new BackgroundWorker();
    lw = new LoadingWindow();

    bw.DoWork + =(发送方,参数)=> {
        //在这里做冗长的工作-这将在单独的线程中进行
        ...
    }

    bw.RunWorkerCompleted + =(发送方,参数)=> {
        if(args.Error!= null)//如果在DoWork期间发生异常,
            MessageBox.Show(args.Error.ToString()); //在这里进行错误处理

        //在此处关闭加载窗口
        ...
    }

    //打开并在此处显示您的加载窗口
    ...

    bw.RunWorkerAsync(); //启动后台工作者
}

关于c# - C#,WPF,无需后台工作人员即可更新GUI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2200744/

10-11 01:13