在我的 WPF 应用程序中,我需要在后台执行数据库操作以使 UI 响应更快。我正在使用 BackgroungWorker 类,但由于它在不同于 UI 的线程上运行,我无法将参数传递给数据库查询。这些值来自 UI 控件。
任何人都可以帮助我解决这个问题或建议一些其他方式来进行数据库操作,同时使 UI 响应。
谢谢你
在我的 WPF 应用程序中,我需要在后台执行数据库操作以使 UI 响应更快。我正在使用 BackgroungWorker 类,但由于它在不同于 UI 的线程上运行,我无法将参数传递给数据库查询。这些值来自 UI 控件。
任何人都可以帮助我解决这个问题或建议一些其他方式来进行数据库操作,同时使 UI 响应。
谢谢你
您可以使用Dispatcher.BeginInvoke方法,而不是使用 BackgroungWorker 类。事实上由 MSDN 指定:
BeginInvoke 是异步的;因此,控制在调用对象后立即返回到调用对象。在 WPF 中,只有创建 DispatcherObject 的线程才能访问该对象。例如,从主 UI 线程分离的后台线程无法更新在 UI 线程上创建的 Button 的内容。为了让后台线程访问 Button 的 Content 属性,后台线程必须将工作委托给与 UI 线程关联的 Dispatcher。这是通过使用 Invoke 或 BeginInvoke 来完成的。Invoke 是同步的,而 BeginInvoke 是异步的。操作被添加到指定 DispatcherPriority 的 Dispatcher 的事件队列中。
这是一篇很好的文章,解释了如何使用 Dispatcher 类。
I think the BackgroundWorker is the correct tool for the job. When you create a BackgroundWorker you specify an event handler for the DoWork
event. The DoWorkEventArgs
object has a property on it called Arguments
which is the object passed in when you start the BackgroundWorker by calling RunWorkerAsync
. You may need to create a helper class to handle the parameters you need to pass, but that should be quite easy. Something like
Helper Class:
public class WorkerArgs
{
public string Arg1 {get;set;}
public object Arg2 {get;set;}
public int Arg3 {get;set;}
}
Background Worker:
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);
In your case, you would populate the helper class object with values from your UI controls.