// s の Dispose 債務はこっち側にあるのか、呼び出し元にあるのかが不明 static async Task RunSubTask(SampleReferenceCount s, TimeSpan delayTime) { await Task.Delay(delayTime); // 値渡しで s を受け取ってるので、Release義務が発生 // Releaseしないとコンパイルエラーになるべき(要Analyzer) s.Release(); }
private static async Task RunTask(Counter counter, Random r) { var s = new SampleReferenceCount(counter).Init(); await Task.WhenAll( RunSubTask(s.Share(), r.Time()), RunSubTask(s.Share(), r.Time()), RunSubTask(s.Share(), r.Time()), RunSubTask(s.Share(), r.Time()), RunSubTask(s.Share(), r.Time()), RunSubTask(s.Move(), r.Time())); // 1個Moveしたので、もう親側にRelease義務なし }