private void BackgroundStardistWorkerThread() { while (!PendingClose) { int wh = WaitHandle.WaitAny(new WaitHandle[] { closeRequested, stardistRequested }); if (PendingClose) { break; } StardistRequest stardistreq = null; switch (wh) { case 0: // Close Requested break; case 1: // Star Distances Requested while (!PendingClose && closestsystem_queue.TryDequeue(out stardistreq)) { if (!stardistreq.IgnoreOnDuplicate || closestsystem_queue.Count == 0) { StardistRequest req = stardistreq; ISystem sys = req.System; SortedList <double, ISystem> closestsystemlist = new SortedList <double, ISystem>(new DuplicateKeyComparer <double>()); //lovely list allowing duplicate keys - can only iterate in it. SystemClassDB.GetSystemSqDistancesFrom(closestsystemlist, sys.x, sys.y, sys.z, 50, true, 1000); if (!PendingClose) { InvokeAsyncOnUiThread(() => { history.CalculateSqDistances(closestsystemlist, sys.x, sys.y, sys.z, 50, true); req.Callback(sys, closestsystemlist); }); } } } break; } } }