C# 未调用BackgroundWorker DoWork函数

C# 未调用BackgroundWorker DoWork函数,c#,multithreading,winforms,backgroundworker,background-thread,C#,Multithreading,Winforms,Backgroundworker,Background Thread,我在我的C#WinForms应用程序中创建了一个加载表单,它在长过程中显示。 我已经在我的加载表单中添加了一个进度条,我想对其进行更新,以便向用户提供一些加载反馈 在我的加载表单代码中,我创建了一个新的BackgroundWorker,并添加了DoWork和ProgressChanged事件处理程序。 问题是没有调用backgroundWorker_ProgressChanged。我已经在函数中插入了断点,它们没有被捕获 我哪里做错了?谢谢你的帮助。谢谢 frmload: public frmL

我在我的C#WinForms应用程序中创建了一个加载表单,它在长过程中显示。 我已经在我的加载表单中添加了一个进度条,我想对其进行更新,以便向用户提供一些加载反馈

在我的加载表单代码中,我创建了一个新的BackgroundWorker,并添加了DoWork和ProgressChanged事件处理程序。 问题是没有调用backgroundWorker_ProgressChanged。我已经在函数中插入了断点,它们没有被捕获

我哪里做错了?谢谢你的帮助。谢谢

frmload:

public frmLoading()
        {
            InitializeComponent();

            //check if bg worker is null
            if (backgroundWorker == null)
            {
                backgroundWorker = new BackgroundWorker();

                backgroundWorker.DoWork += backgroundWorker_DoWork;
                backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;

                
            }

            backgroundWorker.WorkerReportsProgress = true;

            //start
            backgroundWorker.RunWorkerAsync();
        }
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 1; i <= 100; i++)
            {
                Thread.Sleep(100);
                backgroundWorker.ReportProgress(i);
            }
        }
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //update value of progress bar
            progressBar1.Value = e.ProgressPercentage;
            //set the text of the progress bar
            this.Text = e.ProgressPercentage.ToString();
        }
后台工作人员工作:

public frmLoading()
        {
            InitializeComponent();

            //check if bg worker is null
            if (backgroundWorker == null)
            {
                backgroundWorker = new BackgroundWorker();

                backgroundWorker.DoWork += backgroundWorker_DoWork;
                backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;

                
            }

            backgroundWorker.WorkerReportsProgress = true;

            //start
            backgroundWorker.RunWorkerAsync();
        }
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 1; i <= 100; i++)
            {
                Thread.Sleep(100);
                backgroundWorker.ReportProgress(i);
            }
        }
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //update value of progress bar
            progressBar1.Value = e.ProgressPercentage;
            //set the text of the progress bar
            this.Text = e.ProgressPercentage.ToString();
        }

下面是如何使用
进度
任务完成此任务。运行

public frmLoading()
{
    InitializeComponent();

    IProgress<int> progress = new Progress<int>(p =>
    {
        //update value of progress bar
        progressBar1.Value = p;
        //set the text of the progress bar
        this.Text = p.ToString();
    });

    Task.Run(async () =>
    {
        for (int i = 1; i <= 100; i++)
        {
            await Task.Delay(TimeSpan.FromSeconds(0.1));
            progress.Report(i);
        }
    });
}

使用调试器,调试>窗口>线程,并观察主线程正在做什么。它必须是空闲的,在Application.Run()内部执行,才能执行此事件处理程序。永远不要让它执行昂贵的代码,这是工作线程的工作。自2012年以来,BGW已过时,完全被任务取代。运行并继续。不过,要定期更新UI,所需的只是一个线程,而不是一个后台线程。创建一个简单的Winforms计时器,在加载时启用它,完成后禁用它,或者当ProgressBar达到最大值时。谢谢,我将查看Task.Run。我认为这项工作需要在一个单独的线程上进行,因为我已经有一个大进程在另一个窗体的后台工作。@PaulAlexander-
任务。Run
将在另一个线程上执行。为什么要检查
backgroundWorker==null
?当然是
null
,您在表单的构造函数中。除非你没有展示其他东西,比如试图以某种方式回收这张表格。移动
backgroundWorker.RunWorkerAsync()
Form.Load
Form.OnLoad
(或
OnShown()
查看表单是否显示渲染)。如果它没有启动,那么你就不能让它启动,因为有其他东西阻塞了UI线程,所以这行代码永远不会执行。