ReactiveCollectionのClearOnSchedulerでTaskCompletionSourceを使いクリア完了を待つコード

C# コンピュータ
C#

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を使いタスクの終了を待つようにしてみました。本来の使い方と異なる気がしますが、今のところ問題は起きていません。

コメント