在GUI线程中访问数据库,不好不是吗?

时间:2009-06-23 21:46:44

标签: .net database ado.net

我正在研究一些MSDN示例,以及一些关于ADO.Net的书籍。 它们的共同点是使用Visual Studio中的点/点击/拖放设计时间功能来开发数据库应用程序,将数据集绑定到控件等。

据我所知,结果代码在GUI线程中执行所有数据库访问。 这听起来像是不好的做法,并且一旦查询开始需要时间,数据库访问应用程序的烦人行为。

我错过了什么吗?这是我们应该如何开发数据库应用程序? 我通常不会三思而后行,将网络IO放在一个单独的线程中。

6 个答案:

答案 0 :(得分:5)

是的,除非你真的不关心GUI挂起,否则这是一个坏主意。在某些情况下,特别是对于“快速和肮脏”的工具,这实际上是正确的选择。如果这意味着你可以向那些将要使用它的用户得到一些东西,并且关心很快就能完成工作,而不是总是拥有响应式UI,那么在线程之间浪费时间就没什么意义了。

但不,不是你打算如何开发能够保持响应的数据库应用程序。

但是,我可以理解为什么书籍和教程会这样做 - 至少在某种程度上如此。如果他们试图教你数据库访问而不是线程,那就意味着更大比例的代码与主题相关,而不是一切都是绝对的“生产代码”。我从经验中知道,很难将“教学代码”保持为干净。

但是,我认为 对于这样的教程和书籍来说是一个好主意,可以预先解释这个,所以它们不会导致坏习惯。

答案 1 :(得分:2)

请注意,此练习的主要问题与线程无关,但与关注点分离有关。通过将数据库访问与UI紧密绑定,它们失去了分离可用的可能性,并且在UI更改时需要更改数据库,反之亦然。

在同一个线程中是否重要取决于具体情况,平台等。

答案 2 :(得分:1)

许多MSDN示例和Visual Studio本身都鼓励使用“智能表单”反模式,您可以在画布上拖动内容并连接一些小代码,然后您就可以使用它了。他们的目标是轻松入门,没有太多的并发症。

更优化的是让工作线程做任何IO密集型操作并保持GUI响应(除非目标是在10分钟内完成工作)。

答案 3 :(得分:1)

错误

如果您的查询需要20秒怎么办?再见UI。

恕我直言,这么多样本构建的原因是.Net中的异步模式非常混乱。

想象一下,如果您的样本看起来像这样:

    private void BasicAsyncWithNoProgress() {

        if (Application.Current.Dispatcher.Thread != System.Threading.Thread.CurrentThread) {
            Application.Current.Dispatcher.Invoke((System.Windows.Forms.MethodInvoker) BasicAsyncWithNoProgress, null);
            return;
        }

        // Do Work 
    }

将此与发明的语法(可通过postharp实现)进行对比

[NotOnUIThread]
private void BasicAsyncWithNoProgress() {
        // Do Work 
}

答案 4 :(得分:0)

在许多情况下,您肯定希望在GUI和数据访问代码之间实现分离。

但是,大多数书籍都提供有关功能的信息,而不是建筑最佳实践。

答案 5 :(得分:0)

这是坏还是不完全取决于应用程序的类型。如果查询具有不花费大量时间的性质,那么将线程复杂性排除在图片之外可能并不是一个坏主意。但是一旦你开始耗费大量的查询,你可能希望将它们放在自己的工作线程上。