いくつかのセクションを持つ既存の WPF アプリケーションがあります。すべてのセクションは、インターフェイスを実装する UserControl です。
void LoadData([...])
インターフェイスはとの 2 つのメソッドを指定しますbool UnloadData()
。
これらのメソッドは UI スレッドによって呼び出されるため、時間がかかる場合は backgroundworker で作業を行う必要があります。
LoadData
UI を非同期で更新できるので問題ありません。問題は UnloadData() にあります。
現在のビューを本当に離れることができる場合、これは返されるはずです。
これは、データの現在のステータス (保存済み/変更済み/無効) で計算されます。
- 保存されたリターンtrue、
- Invalid は、正しいデータを保存するためにとどまるか、保存せずに終了するかを尋ねます
- 変更をキャンセルする (true を返す) か、編集を続行する (false を返す) か、現在のデータを保存する (true を返す) ことができると変更されました。
問題は、「変更 -> 保存」にあります。これは時間のかかる方法であるため、アプリケーションの哲学を尊重するために、これをバックグラウンド スレッドで実行する必要があります (ビジー インジケーターを使用)。
しかし、スレッドを起動して次のセクションに進むと、メソッド呼び出しに「true」が返され、次のビューを直接起動します。
私の場合、ローカル データが保存される前に次のビューを読み込むと、問題が発生する可能性があります。
そう:
UI をブロックせずに、「true」を返す前にバックグラウンド スレッドが終了するのを待つ方法はありますか?
public bool UnloadData(){
if(...){
LaunchMyTimeConsumingMethodWithBackgroundWorker();
return true;//Only when my time consuming method ends
}
//[...]
}
重要な編集 多分私は十分に明確ではありませんでした.BackgroundWorkerまたはTPLの使用方法を知っています. 私の問題は、親クラス (UnloadData() を呼び出すクラス) が編集できないクラスであることです (複数の理由で: リロードされない別の DLL にあり、すでに 70 以上の userControls で動作しており、すべて個別に動作します)。プロジェクト(dll)、リフレクションによってロードされます。
これは私の選択ではありません。良くないと思いますが、今は対処しなければなりません。私は主に、メソッドの戻り時にメソッドを待機させる方法を探しています。それが可能かどうかはわかりません。しかし、回避策を探しています。これにより、数週間の作業が不要になります。