private void WorkProcessor(BlockingCollection <SubJob> workQueue, BlockingCollection <SubJob> sendQueue, CancellationToken ct) { while (!ct.IsCancellationRequested) { try { SubJob subJob = _workQueue.Take(ct); SubJobResult subJobResult = _resultCache.GetEmptySubJobResult(readZValues: false); SubJobOperationType operationType = DetermineOperationType(subJob, subJobResult); if (operationType != SubJobOperationType.None && operationType != SubJobOperationType.Fetch) { subJob.OperationType = operationType; subJob.SubJobResult = subJobResult; if (ProcessSubJob(subJob, ct)) { _sendQueue.Add(subJob); } else { // Since we are not using this SubJobResult, mark it as free subJob.SubJobResult.IsFree = true; } } else { // Since we are not using this SubJobResult, mark it as free subJobResult.IsFree = true; } } catch (TaskCanceledException tce) { Console.WriteLine($"Process SubJob, instance:{InstanceNum} got error: {tce.Message}."); break; } catch (OperationCanceledException oce) { Console.WriteLine($"Process SubJob, instance:{InstanceNum} got error: {oce.Message}."); break; } catch (Exception e) { Console.WriteLine($"Process SubJob, instance:{InstanceNum} got error: {e.Message}."); //break; } } }
private void HandleSubJob(SubJob subJob) { SubJobResult subJobResult = _resultCache.GetEmptySubJobResult(readZValues: false); SubJobOperationType operationType = DetermineOperationType(subJob, subJobResult); if (operationType == SubJobOperationType.Fetch) { Console.WriteLine($"Sub Job Results were retreived from file. {GetDiagInfo(subJob)}"); subJob.OperationType = operationType; subJob.SubJobResult = subJobResult; _sendQueue.Add(subJob); } else { // Since we are not using this SubJobResult, mark it as free subJobResult.IsFree = true; } }
private SubJobOperationType DetermineOperationType(SubJob subJob, SubJobResult subJobResult) { SubJobOperationType result = SubJobOperationType.Unknown; if (subJob.ParentJob.Closed) { Debug.WriteLine($"Not Processing Sub Job. {GetDiagInfo(subJob)}"); return(SubJobOperationType.None); } if (TryRetrieveWorkResultFromRepo(subJob, subJobResult)) { uint targetIterations = subJob.ParentJob.FJobRequest.MaxIterations; if (subJobResult.IterationCount == 0 || subJobResult.IterationCount == targetIterations) { // The WorkResult read from file has the correct iteration count. (Or we are not tracking the iteration count.) //Console.WriteLine("Sub Job Results were retreived from file. {GetDiagInfo(subJob)}"); result = SubJobOperationType.Fetch; } else if (subJobResult.IterationCount < targetIterations) { result = SubJobOperationType.IncreaseIterations; } else { result = SubJobOperationType.DecreaseIterations; } } else { result = SubJobOperationType.Build; } return(result); }