ある種のライフタイムを持つクラスを考えてみましょう。この存続期間中、イベントは何度でも発生する可能性があり、イベントはタスク (イベントの後に更新される) の完了によって通知されます。オブジェクトはシャットダウンされ、その存続期間が終了することもあります。シャットダウンは、タスクの完了によっても通知されます。それは永遠に生きることもできます。
次に、オブジェクトのライフサイクルをモデル化したある種の非同期ワークフローを考えてみましょう。
//will be completed on Shutdown. Is the same object for the entire lifetime.
Task shutdownTask = ...
while(true)
{
//will be completed when the event occurs. Is different on each loop.
Task eventTask = ...
if (await Task.WhenAny(shutdownTask, eventTask) == eventTask)
{
//Event has occured
...
}
else
{
//Object has been shutdown. React and leave.
...
return;
}
}
eventTask の例として、非同期キューからオブジェクトを非同期的にデキューすることが挙げられます。
直観的には、オブジェクトのライフサイクルをこのようにモデル化することに何の問題もありません。ただし、オブジェクトは永久に存続する可能性があり、無制限の数の継続が shutdownTask に登録されます。それとも彼らですか?継続は登録解除されますか、それともアプリは最終的に爆発しますか? そのような制御フローをモデル化するためのよりクリーンなパターンはありますか?