在我的WPF應用程序中,我需要在後臺執行數據庫操作以使UI更具響應性。 我正在使用BackgroungWorker類,但由於它在不同於UI的線程上運行,我無法將參數傳遞給數據庫查詢。這些值來自UI控件。在WPF應用程序的後臺執行數據庫操作?
任何人都可以請幫我解決這個問題,或者建議其他方式來做數據庫操作,同時使UI響應。
謝謝
在我的WPF應用程序中,我需要在後臺執行數據庫操作以使UI更具響應性。 我正在使用BackgroungWorker類,但由於它在不同於UI的線程上運行,我無法將參數傳遞給數據庫查詢。這些值來自UI控件。在WPF應用程序的後臺執行數據庫操作?
任何人都可以請幫我解決這個問題,或者建議其他方式來做數據庫操作,同時使UI響應。
謝謝
如果不使用,你可以用Dispatcher.BeginInvoke方法工作BackgroungWorker類的。實際上,如MSDN所指定的:
BeginInvoke是異步的;因此,控件在被調用後立即返回給調用對象。 在WPF中,只有創建DispatcherObject的線程可以訪問該對象。例如,從主UI線程分離出的後臺線程無法更新在UI線程上創建的Button的內容。爲了讓後臺線程訪問Button的Content屬性,後臺線程必須將工作委託給與UI線程關聯的Dispatcher。這是通過使用Invoke或BeginInvoke完成的。 Invoke是同步的,BeginInvoke是異步的。該操作將在指定的DispatcherPriority中添加到Dispatcher的事件隊列中。
Here一篇很好的文章,解釋瞭如何使用Dispatcher類。
我認爲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控件填充值的輔助類對象。
從主UI線程分離出的後臺線程無法更新在UI線程上創建的控件的內容。 – gliderkite
@gliderkite OP要求一種將參數傳遞給UI的方法,這可以按照描述完成。根據這篇文章http://stackoverflow.com/a/2806824/371298在UI線程上創建Background worker意味着RunWorkerCompleted事件在UI線程上引發,並且可以在沒有交叉線程異常的情況下訪問控件。 –