in src/Assessment/BatchAssessments.cs [29:115]
public Dictionary<AssessmentInformation, AssessmentPollResponse> CreateAssessmentsInBatch(UserInput userInputObj)
{
foreach (AssessmentInformation assessmentInfo in AllAssessments)
{
Semaphore.Wait();
if (AssessmentStatusMap.ContainsKey(assessmentInfo))
AssessmentStatusMap.Add(assessmentInfo, AssessmentPollResponse.NotCreated);
if (userInputObj.CancellationContext.IsCancellationRequested)
break; // we need all tasks to terminate first
bool isAssessmentCreated = false;
try
{
isAssessmentCreated = new HttpClientHelper().CreateAssessment(userInputObj, assessmentInfo).Result;
}
catch (OperationCanceledException)
{
break; // we need all tasks to terminate
}
catch (AggregateException aeCreateAssessment)
{
string errorMessage = "";
bool isOperationCancelledException = false;
foreach (var e in aeCreateAssessment.Flatten().InnerExceptions)
{
if (e is OperationCanceledException)
{
isOperationCancelledException = true;
break; // from inner for
}
else
{
errorMessage = errorMessage + e.Message + " ";
}
}
if (isOperationCancelledException)
break; // from outer while, we need all processes to terminate
AssessmentStatusMap[assessmentInfo] = AssessmentPollResponse.NotCreated;
userInputObj.LoggerObj.LogWarning($"Assessment {assessmentInfo.AssessmentName} creation failed: {errorMessage}");
}
catch (Exception ex)
{
AssessmentStatusMap[assessmentInfo] = AssessmentPollResponse.NotCreated;
userInputObj.LoggerObj.LogWarning($"Assessment {assessmentInfo.AssessmentName} creation failed: {ex.Message}");
}
if (isAssessmentCreated)
AssessmentStatusMap[assessmentInfo] = AssessmentPollResponse.Created;
if (AssessmentStatusMap[assessmentInfo] != AssessmentPollResponse.Created)
{
Semaphore.Release();
continue;
}
var taskToAdd = Task.Run(async () =>
{
try
{
await PollAssessmentInParallel(assessmentInfo, userInputObj);
}
catch (Exception)
{
throw;
}
finally
{
// Always release semaphore
Semaphore.Release();
}
});
Tasks.Add(taskToAdd);
}
// wait for all tasks to terminate, even if user cancelled the process
Task.WaitAll(Tasks.ToArray());
if (userInputObj.CancellationContext.IsCancellationRequested)
UtilityFunctions.InitiateCancellation(userInputObj);
userInputObj.LoggerObj.LogInformation("Assessment batch job completed");
return AssessmentStatusMap;
}