C# 未调用BackgroundWorker DoWork函数
我在我的C#WinForms应用程序中创建了一个加载表单,它在长过程中显示。 我已经在我的加载表单中添加了一个进度条,我想对其进行更新,以便向用户提供一些加载反馈 在我的加载表单代码中,我创建了一个新的BackgroundWorker,并添加了DoWork和ProgressChanged事件处理程序。 问题是没有调用backgroundWorker_ProgressChanged。我已经在函数中插入了断点,它们没有被捕获 我哪里做错了?谢谢你的帮助。谢谢 frmload: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
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线程,所以这行代码永远不会执行。