【问题标题】:BackgroundWorker with SqlConnectionBackgroundWorker 与 SqlConnection
【发布时间】:2012-12-10 15:32:42
【问题描述】:

我知道我在这里有一个巨大的 derp 时刻,这实际上可能很容易做到 - 我已经搜索并阅读了一些文章,但我仍然有点挣扎,所以任何反馈或指针有用的资源将不胜感激!

无论如何,我有一个名为PopulateDatagridViews 的类,其中包含各种函数,其中一个名为ExecuteSqlStatement,这个函数很简单,它初始化一个SQL 连接并返回一个DataTable,其中填充了以下结果SQL 查询。在同一个类中,我还有各种使用字符串构建器来构建 SQL 语句的函数。 (不理想,我知道。)

我在我的 GUI 线程中创建了一个 PopulateDatagridViews 对象,并使用它来设置各种数据网格视图以及返回的 DataTables。例如:

dataGridViewVar.DataSource = populateDgv.GetCustomers();

我遇到的一个问题自然是从数据库中读取的数据越多,UI 无响应的时间就越长。我想将通过PopulateDatagridViews 检索数据的过程转移到单独的线程或BackgroundWorker,以防止主GUI线程在处理时锁定。

我意识到我可以创建一个BackgroundWorker 来执行此操作,并在DoWork 处理程序中调用我的PopulateDatagridViews 中的适当函数。

我想我可以为PopulateDatagridViews 类中的每个单独函数创建一个BackgroundWorker,但肯定有更有效的方法来做到这一点吗?我非常感谢在正确的方向上指出这一点,因为它正在驱使我绕过弯道!

附加信息:我使用 .Net 框架的 4.0 版。

【问题讨论】:

  • 您使用的是哪个 .Net 版本?
  • 我使用的是 .Net 4.0 版

标签: c# sql multithreading user-interface backgroundworker


【解决方案1】:

我强烈建议您使用 TPL(任务并行库)http://msdn.microsoft.com/en-us/library/dd537609.aspx 在您的情况下,您将创建第一个任务以提取一些数据,然后在第一个任务完成后开始第二个任务以更新 UI。 我会尝试找到我为类似问题编写的代码。

编辑:添加代码

Task<return_type> t1 = new Task<return_type>(() =>
            {
                //do something to take some result
                return some_result; //return it
            });
            t1.Start();
            Task t2 = t1.ContinueWith((some_arg_that_represent_previous_task_obj) =>{//ContinueWith guarantees that t2 is started AFTER t1 is executed!                

                //Update your GUI here
                //if you need result from previos task:   some_arg_that_represent_previous_task_obj.Result   //Your dataset or whatever

            }, TaskScheduler.FromCurrentSynchronizationContext());  //VERY important - you must update gui from same thread that created it! (you will have cross thread exeption if you dont add TaskScheduler.FromCurrentSynchronizationContext()

希望对你有帮助。

【讨论】:

  • 这听起来确实像我需要的。如果你有一个代码示例,我将非常感激!我真的不喜欢 MSDN 的例子,它们解释起来往往过于复杂,真的。呵呵。
【解决方案2】:

那么在这种情况下,我建议阅读此msdn article 以获得一些想法。之后你应该寻找一些教程,因为 msdn 不是学习东西的最佳来源。 ;o)

【讨论】:

  • 哈哈,是的,我同意这一点,我尽可能使用 dotnetperls,遗憾的是它没有我想要的那么全面!很好的资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2010-12-03
相关资源
最近更新 更多