BackgroundWorker中不调用主框架Timer
Main frame Timer is not called in BackgroundWorker
我有一个非常基本的要求。当后台工作正在进行时,我想显示一个进度条。我使用可见的 属性 来管理进度条的外观。进度条本身就是一个用户控件,在主框架中实例化。
在后台工作器中,我使用 Invoke API 更新主框架的列表视图。我所期望的是当列表被填充时进度条应该工作,但我发现进度条用户控件的计时器没有被调用。
这是代码片段:
// Assigning back ground work
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.FetchDataFromDB);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.DoneWork);
FetchDataFromDBAPI被后台worker调用,后台worker又调用主框架的PopulateListAPI
private void FetchDataFromDB(object sender, System.ComponentModel.DoWorkEventArgs args)
{
if (this.InvokeRequired)
{
this.Invoke(new M_Delegate(() => this.PopulateList()));
}
}
private void DoneWork(object sender, RunWorkerCompletedEventArgs e)
{
// Disable progress bar
circularProgressBar_usercontrol1.Visible = false;
}
private void PopulateList()
{
..... Populate listview of the main frame
}
这就是我调用后台工作者的方式。
// Making progress bar visible
circularProgressBar_usercontrol1.Visible = true;
backgroundWorker1.RunWorkerAsync();
circularProgressBar_usercontrol1有定时器,控制进度条。我在定时器的 timer1_Tick API 处添加了一个断点,我发现这个 API 只有在后台工作完成后才会被调用。
因此,计时器在后台工作期间不工作,因此,我的进度条无法正常工作。
请告诉我我的代码有什么问题。
提前致谢!!
您 运行 所有代码都在主线程上从数据库中读取,因为您立即将工作安排回主线程。
使用工作线程的目的是 运行 减慢后台线程的运行速度,而不是将完成的结果快速发送到 UI 线程(请注意,您还需要避免给出 LINQ 查询的结果,因为它们使用惰性执行,目标线程上的代码仍然可能 运行 变慢 - 请参阅下面示例中的 .ToList
调用):
private void FetchDataFromDB(object sender, System.ComponentModel.DoWorkEventArgs args)
{
// slow reading from DB on worker thread
var listFromDb = this.ReadDataFromDb().ToList();
// send populated result to main thread
if (this.InvokeRequired)
{
this.Invoke(AddItemsToUiList(listFromDb)));
}
}
我有一个非常基本的要求。当后台工作正在进行时,我想显示一个进度条。我使用可见的 属性 来管理进度条的外观。进度条本身就是一个用户控件,在主框架中实例化。
在后台工作器中,我使用 Invoke API 更新主框架的列表视图。我所期望的是当列表被填充时进度条应该工作,但我发现进度条用户控件的计时器没有被调用。
这是代码片段:
// Assigning back ground work
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.FetchDataFromDB);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.DoneWork);
FetchDataFromDBAPI被后台worker调用,后台worker又调用主框架的PopulateListAPI
private void FetchDataFromDB(object sender, System.ComponentModel.DoWorkEventArgs args)
{
if (this.InvokeRequired)
{
this.Invoke(new M_Delegate(() => this.PopulateList()));
}
}
private void DoneWork(object sender, RunWorkerCompletedEventArgs e)
{
// Disable progress bar
circularProgressBar_usercontrol1.Visible = false;
}
private void PopulateList()
{
..... Populate listview of the main frame
}
这就是我调用后台工作者的方式。
// Making progress bar visible
circularProgressBar_usercontrol1.Visible = true;
backgroundWorker1.RunWorkerAsync();
circularProgressBar_usercontrol1有定时器,控制进度条。我在定时器的 timer1_Tick API 处添加了一个断点,我发现这个 API 只有在后台工作完成后才会被调用。
因此,计时器在后台工作期间不工作,因此,我的进度条无法正常工作。
请告诉我我的代码有什么问题。
提前致谢!!
您 运行 所有代码都在主线程上从数据库中读取,因为您立即将工作安排回主线程。
使用工作线程的目的是 运行 减慢后台线程的运行速度,而不是将完成的结果快速发送到 UI 线程(请注意,您还需要避免给出 LINQ 查询的结果,因为它们使用惰性执行,目标线程上的代码仍然可能 运行 变慢 - 请参阅下面示例中的 .ToList
调用):
private void FetchDataFromDB(object sender, System.ComponentModel.DoWorkEventArgs args)
{
// slow reading from DB on worker thread
var listFromDb = this.ReadDataFromDb().ToList();
// send populated result to main thread
if (this.InvokeRequired)
{
this.Invoke(AddItemsToUiList(listFromDb)));
}
}