// 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義務なし
        }