internal EventLoopContext(DefaultHostRunner runner, IContext context) { _runner = runner ?? throw new ArgumentNullException(nameof(runner)); context = context ?? throw new ArgumentNullException(nameof(context)); if (context is InitFinalContext initContext) { _init = initContext; _msg = initContext.GetMessage(); if (initContext?.IsFinalizationPhase() ?? false) { throw new InvalidOperationException(Resources.EventLoopContext_InvalidOperationException); } } else if (context is EventLoopContext prevContext) { _init = prevContext._init; _prev = prevContext; _msg = prevContext._msg; // 2つ前の文脈情報を削除してメモリ節約 prevContext._prev?.Dispose(); prevContext._prev = null; } else { throw new ArgumentException(Resources.EventLoopContext_ArgumentException, nameof(context)); } this.Paths = context.Paths; this.Settings = context.Settings; this.Arguments = context.Arguments; this.LogFile = context.LogFile; }
private async Task FinalizationPhase() { var context = new InitFinalContext(this, _initContext); for (int i = _services.Count - 1; i >= 0; --i) { await _services[i].FinalizeAsync(context); } }