为什么我在使用BackgroundWorker this.Dispatcher.BeginInvoke((Action)



我有一个函数,它从数据库中导入数据,并在WPF应用程序中填充DataGridView (winform)。

最初我让应用程序通过它的主线程调用函数。性能运行在每1000行10秒左右,这比我希望的要长得多。然而,因为使用了这个应用程序,所以花多长时间并不重要,所以我不太担心提高速度。

我想做的是使行填充,因为他们进来使用BackgroundWorker检索行,然后调用BackgroundWorker添加行,因为他们进来+提供一个进度条。

我一直在折腾,决定只调用整个方法,现在导入数据row所需的时间更像是每1000行1秒。

我的代码看起来像这样:

Window_Loaded() 
{
        dataPopulater = new BackgroundWorker(); // variable declared in the class
        dataPopulater.WorkerReportsProgress = true;
        dataPopulater.DoWork += new DoWorkEventHandler(dataPopulater_DoWorkReadSavedRecords);
        dataPopulater.ProgressChanged += new ProgressChangedEventHandler(dataPopulater_ProgressChanged);
        dataPopulater.RunWorkerCompleted += dataPopulater_RunWorkerCompleted;
        dataPopulater.RunWorkerAsync(startUpRead);
}
private void dataPopulater_DoWorkReadSavedRecords(object sender, DoWorkEventArgs e)
    {
        this.Dispatcher.BeginInvoke((Action)delegate()
            {
              //Import method...
            });
    }

你知道为什么我的表现会有这样的提升吗?我的理解是this.Dispatcher.BeginInvoke((Action)delegate() {});命令在主线程上运行下面的任何内容,这就是我之前使用10秒/1,000行的性能所做的。是否创建一个后台工作分配更多的处理速度/内核或类似的东西?

我就是不知道为什么会这样。

根据您的注释,以前版本的代码是在更新循环内向数据网格添加一行。向网格控件添加行有很多开销,主要来自控件重新绘制自身。

在窗体上调用。begininvoke实际上并没有立即完成工作,它只是在UI线程上排队并立即返回。这个小改动允许您的更新逻辑在与UI更新不同的线程上全速运行。从本质上讲,您将逻辑与表示分离,允许每个逻辑彼此异步运行。

相关内容

最新更新