代码之家  ›  专栏  ›  技术社区  ›  Tamas555

如何允许backgroundworker更新UI并为其设置(metro)Progressing?

  •  1
  • Tamas555  · 技术社区  · 7 年前

    就在半年前,我还在学习c。 我有一个帮助我工作的程序,它与我工作场所的4种数据库进行通信。它工作得很好,但现在我想设计得更酷一些,但当我想设置一个进度环时,我卡住了,因为我的方法在与数据库通信时冻结了UI。 我想设置一个后台工作程序,我尝试了所有我发现的东西,甚至调用,但都没有成功。

    public partial class MainWindow : MetroWindow
    {
        BackgroundWorker workerThread = null;
    
        public MainWindow()
        {
            InitializeComponent();
            InstantiateWorkerThread();
    
            progressrinG.IsActive = true;
        }
        private void InstantiateWorkerThread()
        {
            workerThread = new BackgroundWorker();
            workerThread.ProgressChanged += WorkerThread_ProgressChanged;
            workerThread.DoWork += WorkerThread_DoWork;
            workerThread.RunWorkerCompleted += WorkerThread_RunWorkerCompleted;
            workerThread.WorkerReportsProgress = true;
            //workerThread.WorkerSupportsCancellation = true;
        }
    
        private void WorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
    
        }
        private void WorkerThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
    
        }
        private void WorkerThread_DoWork(object sender, DoWorkEventArgs e)
        {
            //My huge method,asking 4 database that would update UI too
            //... Textboxes,Grids,Expanders.
        }
    
        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            workerThread.RunWorkerAsync();
    
            while (workerThread.IsBusy)
            {
                progressrinG.Visibility = Visibility.Visible;
            }
        }
    }
    

    即使使用Invoke,当我按下按钮时,5-10秒后它完成了我的方法,但我的应用程序在执行时被冻结,我看不到进程。

    你知道我做错了什么吗?或者我该怎么办?提前感谢!

    2 回复  |  直到 7 年前
        1
  •  1
  •   Deleted    7 年前

    不从中的工作线程更新UI WorkerThread_DoWork ,而是通过中的UI线程执行此操作 WorkerThread_ProgressChanged .

    worker.ReportProgress 从你的工人通过一个任意百分比的进度,以便 WorkerThread\u进度已更改 被称为。仅当百分比差异已更改时才更新UI,以防止UI更新耗尽。

        2
  •  0
  •   A Quick    7 年前

            private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progress = e.ProgressPercentage;
            progressLabel.Text = "Creating User " + totalUserCreatedCount + " of " + rowCount;
        }
    

    每次我再次从循环的顶部开始,我都会经历一个循环,并对其进行报告。我称之为这样的改变

    backgroundWorker.ReportProgress((100 * i) / rowCount);
    

    Row count是我希望循环的总次数。

    希望这有意义?