public Dictionary CreateAssessmentsInBatch()

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;
        }