private static async Task RunTask(Counter counter, Random r) { var s = new SampleDisopsable(counter); await Task.WhenAll( RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time())); // 「子タスクの誰かが Dispose 呼ぶんじゃないかなぁ」みたいな「にらめっこ」の結果、Dispose が呼ばれてないとする }
private static async Task RunTask(Counter counter, Random r) { var s = new SampleDisopsable(counter); await Task.WhenAll( RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time()), RunSubTask(s, r.Time())); // 正しく子タスクが全部終わったことを確認してから s を Dispose しないといけない s.Dispose(); }
// s の Dispose 債務はこっち側にあるのか、呼び出し元にあるのかが不明 static async Task RunSubTask(SampleDisopsable s, TimeSpan delayTime) { await Task.Delay(delayTime); // この例の場合は呼び出し元側でちゃんと管理していると思っているので、Dispose は呼ばない }
// s の Dispose 債務はこっち側にあるのか、呼び出し元にあるのかが不明 static async Task RunSubTask(SampleDisopsable s, TimeSpan delayTime) { await Task.Delay(delayTime); // この例の場合は呼び出し元側でちゃんと管理しているからここで Dispose を呼んじゃダメ }