public void ClosestApproachAsync(CorrectionData correctionData, CalcCallback calcCallback)
 {
     correctionData.gravityState.isAsync = true;
     this.calcCallback = calcCallback;
     calcState         = CalcState.CLOSEST_APPROACH;
     // setup Mutex
     threadCountMutex.WaitOne();
     threadsPending++;
     threadCountMutex.ReleaseMutex();
     System.Threading.ThreadPool.QueueUserWorkItem(
         new System.Threading.WaitCallback(CalcCorrectionThread),
         new object[] { correctionData, CreateUnityAdapter(), (JobResultHandler)CalcResultHandler });
 }
    public string CorrectionCalcAsync(double targetDistance,
                                      double targetAccuracy,
                                      double approachDistance,
                                      double maxTime,
                                      CalcCallback calcCallback)
    {
        this.calcCallback = calcCallback;
        double[] corrections = { -0.001, 0, 0.001 };
        this.targetDistance = targetDistance;
        this.targetAccuracy = targetAccuracy;

        threadsPending = 0;
        calcState      = CalcState.NOT_STARTED;

        string        s  = "";
        GravityEngine ge = GravityEngine.Instance();

        correctionData = new CorrectionData[corrections.Length];
        int i = 0;

        foreach (double correction in corrections)
        {
            // Run each computation as a dedicated thread
            correctionData[i] = new CorrectionData();
            correctionData[i].gravityState     = ge.GetGravityStateCopy();
            correctionData[i].approachDistance = approachDistance;
            correctionData[i].maxPhysTime      = maxTime;
            correctionData[i].correction       = correction;
            threadCountMutex.WaitOne();
            threadsPending++;
            threadCountMutex.ReleaseMutex();
            System.Threading.ThreadPool.QueueUserWorkItem(
                new System.Threading.WaitCallback(CalcCorrectionThread),
                new object[] { correctionData[i], CreateUnityAdapter(), (JobResultHandler)CalcResultHandler });
            i++;
        }
        calcState = CalcState.INITIAL_THREE;
        return(s);
    }