私の WPF アプリケーションでは、バックグラウンドでデータベース操作を実行して、UI の応答性を高める必要があります。BackgroungWorker クラスを使用していますが、UI のスレッドとは異なるスレッドで動作するため、パラメーターをデータベース クエリに渡すことができません。これらの値は UI コントロールから取得されます。
誰かがこの問題を手伝ってくれるか、データベース操作を行う他の方法を提案してくれると同時に、UI をレスポンシブにすることができます。
ありがとうございました
私の WPF アプリケーションでは、バックグラウンドでデータベース操作を実行して、UI の応答性を高める必要があります。BackgroungWorker クラスを使用していますが、UI のスレッドとは異なるスレッドで動作するため、パラメーターをデータベース クエリに渡すことができません。これらの値は UI コントロールから取得されます。
誰かがこの問題を手伝ってくれるか、データベース操作を行う他の方法を提案してくれると同時に、UI をレスポンシブにすることができます。
ありがとうございました
BackgroungWorker クラスを使用する代わりに、 Dispatcher.BeginInvokeメソッドを使用できます。実際、MSDN で指定されているとおりです。
BeginInvoke は非同期です。したがって、制御は呼び出された後、呼び出し元のオブジェクトにすぐに戻ります。WPF では、DispatcherObject を作成したスレッドのみがそのオブジェクトにアクセスできます。たとえば、メインの UI スレッドからスピンオフされたバックグラウンド スレッドは、UI スレッドで作成された Button の内容を更新できません。バックグラウンド スレッドが Button の Content プロパティにアクセスするには、バックグラウンド スレッドが UI スレッドに関連付けられた Dispatcher に作業を委任する必要があります。これは、Invoke または BeginInvoke を使用して実行されます。Invoke は同期で、BeginInvoke は非同期です。操作は、指定された DispatcherPriority で Dispatcher のイベント キューに追加されます。
Dispatcherクラスの操作方法を説明する良い記事です。
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 コントロールの値を入力します。