public TaskResult Complete(TaskResult?result = null, string currentOperation = null, string resultCode = null) { if (result != null) { Result = result; } // report total delay caused by server throttling. if (_totalThrottlingDelayInMilliseconds > _throttlingDelayReportThreshold) { this.Warning($"The job has experienced {TimeSpan.FromMilliseconds(_totalThrottlingDelayInMilliseconds).TotalSeconds} seconds total delay caused by server throttling."); } _record.CurrentOperation = currentOperation ?? _record.CurrentOperation; _record.ResultCode = resultCode ?? _record.ResultCode; _record.FinishTime = DateTime.UtcNow; _record.PercentComplete = 100; _record.Result = _record.Result ?? TaskResult.Succeeded; _record.State = TimelineRecordState.Completed; _jobServerQueue.QueueTimelineRecordUpdate(_mainTimelineId, _record); // complete all detail timeline records. if (_detailTimelineId != Guid.Empty && _detailRecords.Count > 0) { foreach (var record in _detailRecords) { record.Value.FinishTime = record.Value.FinishTime ?? DateTime.UtcNow; record.Value.PercentComplete = record.Value.PercentComplete ?? 100; record.Value.Result = record.Value.Result ?? TaskResult.Succeeded; record.Value.State = TimelineRecordState.Completed; _jobServerQueue.QueueTimelineRecordUpdate(_detailTimelineId, record.Value); } } if (Root != this) { // only dispose TokenSource for step level ExecutionContext _cancellationTokenSource?.Dispose(); } _logger.End(); // Skip if generated context name. Generated context names start with "__". After M271-ish the server will never send an empty context name. if (!string.IsNullOrEmpty(ContextName) && !ContextName.StartsWith("__", StringComparison.Ordinal)) { Global.StepsContext.SetOutcome(ScopeName, ContextName, (Outcome ?? Result ?? TaskResult.Succeeded).ToActionResult()); Global.StepsContext.SetConclusion(ScopeName, ContextName, (Result ?? TaskResult.Succeeded).ToActionResult()); } return(Result.Value); }
public void SetOutput(string name, string value, out string reference) { ArgUtil.NotNullOrEmpty(name, nameof(name)); // Skip if generated context name. Generated context names start with "__". After M271-ish the server will never send an empty context name. if (string.IsNullOrEmpty(ContextName) || ContextName.StartsWith("__", StringComparison.Ordinal)) { reference = null; return; } // todo: restrict multiline? Global.StepsContext.SetOutput(ScopeName, ContextName, name, value, out reference); }