ボタンのクリックから起動されるバックグラウンド非同期タスクがあります。IsBusy
タスクの開始時に更新され、キャンセルまたは完了を説明するためにfinallyブロック内にあるプロパティがあります。
現在、ボタンクリックイベントは前のタスクをキャンセルし、再度クリックすると新しいタスクを開始します。ただし、最初のタスクのキャンセルは新しいタスクの開始後も長引く可能性があるため、ブールIsBusy
インジケーターが同期しなくなる可能性があります。
私の問題は、この状況にどう対処するかです。
私の現在の解決策は、ブール値を直接更新するのではなく、開始時と完了時にインクリメント/デクリメントされる整数を使用することです-IsBusy
プロパティはを返しBusyCount > 0
ます。ただし、これにはスレッドセーフのための追加が必要であり、良い解決策とは思えません。
もう1つの考えは、タスクが実行されたときにタスクを保存し、最初のタスクの続きとしてのみ新しいタスクを開始することでした。これはキャンセルの問題を説明しますが、タスクではなく呼び出し元に不必要な遅延(ただし部分的)と「契約」を強制します。
私の最終的な考えは、スレッドセーフなコレクションに追加/削除される使い捨てのBusyTokenを配布するBusyTokenSourceクラスのようなものを作成することでした。しかし、これはやり過ぎのようです。
このタイプの状況を処理するためのより良い/適切な/一般的な方法はありますか?
編集:
私は上記の最後の考えに行き着き、「BusyToken」クラスを作成しました。このようにして、関数をaでラップしusing(BusyTokenSource.GetToken()){}
、内部コレクションを実行Dispose
して、カウントとビジー状態を処理することができます。