在我的WPF应用程序中,我需要在后台执行数据库操作,以使UI更具响应性。 我正在使用BackgroungWorker类,但由于它在不同于UI的线程上运行,我无法将参数传递给数据库查询。这些值来自UI控件。
有没有人可以帮我解决这个问题或建议其他方式来进行数据库操作,同时让UI响应。
谢谢
答案 0 :(得分:1)
您可以使用Dispatcher.BeginInvoke方法,而不是使用BackgroungWorker类。事实上,正如MSDN所指定的那样:
BeginInvoke是异步的;因此,控制在调用后立即返回调用对象。 在WPF中,只有创建DispatcherObject的线程才能访问该对象。例如,从主UI线程分离出来的后台线程无法更新在UI线程上创建的Button的内容。为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这是通过使用Invoke或BeginInvoke来完成的。 Invoke是同步的,BeginInvoke是异步的。该操作将添加到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控件中的值填充辅助类对象。