简体   繁体   English

C#BackgroundWorker未报告进度

[英]C# BackgroundWorker is not reporting progress

The Background worker in my app does not report progress. 我的应用程序中的后台工作程序不报告进度。 (A breakpoint is set, but it is never reached). (设置断点,但永远不会达到)。 The code I'm using is attached below. 我正在使用的代码附在下面。 I've been working on this for a couple hours and I'm stumped. 我已经在这个工作了几个小时,我很难过。 The 'usual suspects' (setting the boolean for WorkerReportsProgress, and Linking the event to _ProgressChanged, forgetting to call .RunWorkerAsyn() have been checked) I'm puzzled why my breakpoint is never reached. “通常的嫌疑人”(为WorkerReportsProgress设置布尔值,并将事件链接到_ProgressChanged,忘记调用.RunWorkerAsyn()已被检查)我很困惑为什么我的断点永远不会到达。

public partial class Form1 : Form
{
    BackgroundWorker bw_copyToTemp;  //Defined as a member of the class

    private void btnCopyToTemp_Click(object sender, EventArgs e)
    {

       bw_copyToTemp = new System.ComponentModel.BackgroundWorker
       {
           WorkerReportsProgress = true,
           WorkerSupportsCancellation = true
       };
       bw_copyToTemp.DoWork += bw_copyToTemp_DoWork;
       bw_copyToTemp.ProgressChanged += bw_copyToTemp_ProgressChanged;
       bw_copyToTemp.RunWorkerCompleted += bw_copyToTemp_RunWorkerCompleted;


       // Start background worker
       bw_copyToTemp.RunWorkerAsync();
    }

    void bw_copyToTemp_ProgressChanged(object sender,System.ComponentModel.ProgressChangedEventArgs e)
    {
        CurrentState s = (CurrentState)e.UserState;  //<<BREAKPOINT HERE NOT HIT
        toolStripStatusLabel1.Text = s.ProcessStep;
        toolStripProgressBar1.Value = e.ProgressPercentage;
    }

    void bw_copyToTemp_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {

        Properties.Settings prop = Properties.Settings.Default;
        BackgroundWorker worker = sender as BackgroundWorker;
        if (worker.WorkerReportsProgress)
            // Initialize the object that the background worker calls.
            worker.ReportProgress(0, new CurrentState("Called from within form"));  //<<< THIS LINE IS PROCESSED SINGLE STEPPING THROUGH CODE (NO CHANGE IN GUI)

        copyFileOnDVDToTemp.CopyOpticalToHardDrive(worker, e);


    }

    void bw_copyToTemp_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
    {
        // test code goes here
    }
}

The "Current state" class is in a different .cs file with the same namespace: “当前状态”类位于具有相同名称空间的不同.cs文件中:

   public class CurrentState
        {
            public CurrentState() { }
            public CurrentState(string processStep)
            {
                this.ProcessStep = processStep;
            }

            public string ProcessStep { get; set; }

        }

You have missed to call BackgroundWorker.RunWorkerAsync() method in the Click event handler of the button. 您错过了在按钮的Click事件处理程序中调用BackgroundWorker.RunWorkerAsync()方法。 Your worker does not get started after initialization. 初始化后,您的工作人员无法启动。

private void btnCopyToTemp_Click(object sender, EventArgs e)
{

   bw_copyToTemp = new System.ComponentModel.BackgroundWorker
   {
       WorkerReportsProgress = true,
       WorkerSupportsCancellation = true
   };
   bw_copyToTemp.DoWork += bw_copyToTemp_DoWork;
   bw_copyToTemp.ProgressChanged += bw_copyToTemp_ProgressChanged;
   bw_copyToTemp.RunWorkerCompleted += bw_copyToTemp_RunWorkerCompleted;

   // Start background worker
   bw_copyToTemp.RunWorkerAsync();
}

Try the following to see that ReportProgress is called while DoWork is running: 尝试以下操作以查看在DoWork运行时调用ReportProgress

    void bw_copyToTemp_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        // Set breakpoint here
        CurrentState s = (CurrentState)e.UserState; 
    }

    void bw_copyToTemp_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 0; i <= 100; i++)
        {
            // Set breakpoint here
            worker.ReportProgress(i, new CurrentState("Percentage"));
        }
    }

Debug your application and see how the breakpoints get hit. 调试您的应用程序,看看断点是如何被击中的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM