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)));
    }
}