2012-05-05 58 views
0

在我的WPF應用程序中,我需要在後臺執行數據庫操作以使UI更具響應性。 我正在使用BackgroungWorker類,但由於它在不同於UI的線程上運行,我無法將參數傳遞給數據庫查詢。這些值來自UI控件。在WPF應用程序的後臺執行數據庫操作?

任何人都可以請幫我解決這個問題,或者建議其他方式來做數據庫操作,同時使UI響應。

謝謝

回答

1

如果不使用,你可以用Dispatcher.BeginInvoke方法工作BackgroungWorker類的。實際上,如MSDN所指定的:

BeginInvoke是異步的;因此,控件在被調用後立即返回給調用對象。 在WPF中,只有創建DispatcherObject的線程可以訪問該對象。例如,從主UI線程分離出的後臺線程無法更新在UI線程上創建的Button的內容。爲了讓後臺線程訪問Button的Content屬性,後臺線程必須將工作委託給與UI線程關聯的Dispatcher。這是通過使用Invoke或BeginInvoke完成的。 Invoke是同步的,Be​​ginInvoke是異步的。該操作將在指定的DispatcherPriority中添加到Dispatcher的事件隊列中。

Here一篇很好的文章,解釋瞭如何使用Dispatcher類。

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控件填充值的輔助類對象。

+0

從主UI線程分離出的後臺線程無法更新在UI線程上創建的控件的內容。 – gliderkite

+0

@gliderkite OP要求一種將參數傳遞給UI的方法,這可以按照描述完成。根據這篇文章http://stackoverflow.com/a/2806824/371298在UI線程上創建Background worker意味着RunWorkerCompleted事件在UI線程上引發,並且可以在沒有交叉線程異常的情況下訪問控件。 –

相關問題