在WPF应用程序中在后台执行数据库操作?

时间:2012-05-05 13:54:45

标签: wpf

在我的WPF应用程序中,我需要在后台执行数据库操作,以使UI更具响应性。 我正在使用BackgroungWorker类,但由于它在不同于UI的线程上运行,我无法将参数传递给数据库查询。这些值来自UI控件。

有没有人可以帮我解决这个问题或建议其他方式来进行数据库操作,同时让UI响应。

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用Dispatcher.BeginInvoke方法,而不是使用BackgroungWorker类。事实上,正如MSDN所指定的那样:

  

BeginInvoke是异步的;因此,控制在调用后立即返回调用对象。   在WPF中,只有创建DispatcherObject的线程才能访问该对象。例如,从主UI线程分离出来的后台线程无法更新在UI线程上创建的Button的内容。为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这是通过使用Invoke或BeginInvoke来完成的。 Invoke是同步的,Be​​ginInvoke是异步的。该操作将添加到Dispatcher的事件队列中指定的DispatcherPriority。

Here一篇很好的文章,解释了如何使用Dispatcher类。

答案 1 :(得分:0)

我认为BackgroundWorker是正确的工具。创建BackgroundWorker时,为DoWork事件指定事件处理程序。 DoWorkEventArgs对象上有一个名为Arguments的属性,它是通过调用RunWorkerAsync启动BackgroundWorker时传入的对象。您可能需要创建一个帮助程序类来处理需要传递的参数,但这应该非常简单。像

这样的东西

助手班级:

public class WorkerArgs
{
     public string Arg1 {get;set;}
     public object Arg2 {get;set;}
     public int Arg3 {get;set;}
}

后台工作人员:

BackgroundWorker worker = new BackgroundWorker();

// Hook up DoWork event handler
worker.DoWork += (sender, e) => {
     WorkerArgs args = e.Arguments as WorkerArgs;
     // ... Do the rest of your background work
};

// Create arguments to pass to BackgroundWorker
WorkerArgs myWorkerArgs = new WorkerArgs {Arg1 = "Foo", Arg2 = new Object(), Arg3 = 123 };

// Start BackgroundWorker with arguments
worker.RunWorkerAsync(myWorkerArgs);

在您的情况下,您将使用UI控件中的值填充辅助类对象。