WPFのリストビューなどのデータソースとしてReactiveCollectionを使うのですが、一度内容をクリアして再表示するような場合、クリアの終了を待つ必要があります。普通の配列やコレクションであれば、コレクションの要素数をCount()などで取得しそれが0になるまで待機するループを書けば良いのですが、ReactiveCollectionでは良くないことらしいので代替手段を探してみました。
ReactiveCollction<string> collection;
var tcs = new TaskCompletionSource<bool>();
using var v = collection.ObserveResetChanged<int>().Subscribe(x=>
{
// collectionのクリアが完了すると呼ばれるイベント。
tcs.SetResult(true); // 結果にtureをセット
});
collection.ClearOnScheduler();
await tcs.Task; // tcsの終了を待つ
// クリア後の処理をこちらに書く
調べたところObserveResetChangedイベントでクリア完了を知ることが出来ますが、こちらをSubscribeして続きのコードを書くことは何か違う気がします。UIスレッドに制御を戻したいので、TaskCompletionSourceを使いタスクの終了を待つようにしてみました。本来の使い方と異なる気がしますが、今のところ問題は起きていません。
コメント