WPF C# - Update progressbar from another thread

前端 未结 4 1882
星月不相逢
星月不相逢 2020-12-14 03:35

I\'m stuck trying to update a progressbar from other threads ran in a different class. To explain what I do I think a picture will be better. I want to update the progressba

4条回答
  •  天涯浪人
    2020-12-14 03:59

    I got it! Simple in fact, but i guess I've been looking too close to find out.

    In my ExecutorWindow class :

    private void execBackground_DoWork(object sender, DoWorkEventArgs e)
    {
        myExecutor = new Executor(arg1, arg2);
        myExecutor.Run(sender);
    }
    
    private void execBackground_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ExecutorProgressBar.Value += 1;
    }
    

    And in my Executor class :

    private BackgroundWorker myExecutorWindow;
    
    [...]
    
    public void Run(object sender)
    {
                myExecutorWindow = sender as BackgroundWorker;
                string[] options = new string[2];
                int i = 0;
    
                while (LeftToRun > 0)
                {
                    if (CurrentRunningThreads < MaxThreadsRunning)
                    {
                        BackgroundWorker myThread = new BackgroundWorker();
                        myThread.DoWork += new DoWorkEventHandler(backgroundWorkerRemoteProcess_DoWork);
                        myThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorkerRemoteProcess_RunWorkerCompleted);
                        myThread.ProgressChanged += new ProgressChangedEventHandler(backgroundWorkerRemoteProcess_ProgressChanged);
                        myThread.WorkerReportsProgress = true;
                        myThread.WorkerSupportsCancellation = true;
    
                        myThread.RunWorkerAsync(new string[2] {opt1, opt2});
    
                        CurrentRunningThreads++;
                        i++;
                        LeftToRun--;      
                    }
                }
    
    [...]
    
    private void backgroundWorkerRemoteProcess_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker myBackgroundWorker = sender as BackgroundWorker;
                myBackgroundWorker.ReportProgress(1);
                // PROCESSING MY STUFF HERE
                myBackgroundWorker.ReportProgress(1);
            }
    
            private void backgroundWorkerRemoteProcess_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                myExecutorWindow.ReportProgress(1);
            }
    

提交回复
热议问题