0

私の WPF アプリケーションでは、バックグラウンドでデータベース操作を実行して、UI の応答性を高める必要があります。BackgroungWorker クラスを使用していますが、UI のスレッドとは異なるスレッドで動作するため、パラメーターをデータベース クエリに渡すことができません。これらの値は UI コントロールから取得されます。

誰かがこの問題を手伝ってくれるか、データベース操作を行う他の方法を提案してくれると同時に、UI をレスポンシブにすることができます。

ありがとうございました

4

2 に答える 2

1

BackgroungWorker クラスを使用する代わりに、 Dispatcher.BeginInvokeメソッドを使用できます。実際、MSDN で指定されているとおりです。

BeginInvoke は非同期です。したがって、制御は呼び出された後、呼び出し元のオブジェクトにすぐに戻ります。WPF では、DispatcherObject を作成したスレッドのみがそのオブジェクトにアクセスできます。たとえば、メインの UI スレッドからスピンオフされたバックグラウンド スレッドは、UI スレッドで作成された Button の内容を更新できません。バックグラウンド スレッドが Button の Content プロパティにアクセスするには、バックグラウンド スレッドが UI スレッドに関連付けられた Dispatcher に作業を委任する必要があります。これは、Invoke または BeginInvoke を使用して実行されます。Invoke は同期で、BeginInvoke は非同期です。操作は、指定された DispatcherPriority で Dispatcher のイベント キューに追加されます。

Dispatcherクラスの操作方法を説明する良い記事です。

于 2012-05-05T14:03:48.577 に答える
0

BackgroundWorker は、この仕事に適したツールだと思います。BackgroundWorker を作成するときは、イベントのイベント ハンドラーを指定しますDoWork。オブジェクトには、を呼び出して BackgroundWorker を開始したときに渡されるオブジェクトであるというDoWorkEventArgsプロパティがあります。渡す必要があるパラメーターを処理するためにヘルパー クラスを作成する必要がある場合がありますが、それは非常に簡単なはずです。何かのようなものArgumentsRunWorkerAsync

ヘルパー クラス:

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 コントロールの値を入力します。

于 2012-05-05T18:26:55.150 に答える