Exemplo n.º 1
0
        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);
        }