protected override void SolveInstance(IGH_DataAccess DA) { if (State == 0) { if (BaseWorker == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Worker class not provided."); return; } var currentWorker = BaseWorker.Duplicate(); if (currentWorker == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Could not get a worker instance."); return; } // Let the worker collect data. currentWorker.GetData(DA, Params); // Create the task var tokenSource = new CancellationTokenSource(); currentWorker.CancellationToken = tokenSource.Token; currentWorker.Id = $"Worker-{DA.Iteration}"; var currentRun = TaskCreationOptions != null ? new Task(() => currentWorker.DoWork(ReportProgress, Done), tokenSource.Token, (TaskCreationOptions)TaskCreationOptions) : new Task(() => currentWorker.DoWork(ReportProgress, Done), tokenSource.Token); // Add cancellation source to our bag CancellationSources.Add(tokenSource); // Add the worker to our list Workers.Add(currentWorker); Tasks.Add(currentRun); return; } if (!SetData) { return; } if (Workers.Count > 0) { Workers[--State].SetData(DA); } if (State != 0) { return; } CancellationSources.Clear(); Workers.Clear(); ProgressReports.Clear(); Tasks.Clear(); SetData = false; Message = "Done"; OnDisplayExpired(true); }
protected override void GrasshopperBootstrapSolveInstance(IGH_DataAccess da) { if (state == 0) { if (BaseWorker == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Worker class not provided."); return; } var currentWorker = BaseWorker.Duplicate(); if (currentWorker == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Could not get a worker instance."); return; } // Let the worker collect data. currentWorker.GetData(da, Params); // Create the task var tokenSource = new CancellationTokenSource(); currentWorker.CancellationToken = tokenSource.Token; currentWorker.Id = $"Worker-{da.Iteration}"; var currentRun = TaskCreationOptions != null ? new Task(() => currentWorker.DoWork(reportProgress, done), tokenSource.Token, (TaskCreationOptions)TaskCreationOptions) : new Task(() => currentWorker.DoWork(reportProgress, done), tokenSource.Token); // Add cancellation source to our bag CancellationSources.Add(tokenSource); // Add the worker to our list Workers.Add(currentWorker); tasks.Add(currentRun); return; } if (setData == 0) { return; } if (Workers.Count > 0) { Interlocked.Decrement(ref state); Workers[state].SetData(da); } if (state != 0) { return; } CancellationSources.Clear(); Workers.Clear(); ProgressReports.Clear(); tasks.Clear(); Interlocked.Exchange(ref setData, 0); Message = "Done"; OnDisplayExpired(true); }