private void StartSearchLoop() { var cancellationToken = _cancellationTokenSource.Token; var handlesToWait = new[] { cancellationToken.WaitHandle, _runSearchLoop }; void SearchLoop() { if (IsRecurrent) { ReproductionParameters.WeightMutations.OverallRouletteWheelShare = 75f; ReproductionParameters.AddConnectionRouletteWheelShare = 16f; } while (true) { var searchModel = new XorNetworkSearch( PopulationParameters, IsRecurrent ? RecurrentNetworkParameters : FeedForwardNetworkParameters, ReproductionParameters); SearchResult searchResult = default; InvokeOnUiThread(HandleStartNewSearchRun); for (var generation = 0; generation < GenerationsCount; ++generation) { WaitHandle.WaitAny(handlesToWait); if (cancellationToken.IsCancellationRequested) { return; } var newSearchResult = searchModel.SearchNext(); InvokeOnUiThread(() => HandleNewPopulationFound(newSearchResult)); searchResult = newSearchResult; } InvokeOnUiThread(() => HandleFinishSearchRun()); } } _searchThread = new Thread(SearchLoop); _searchThread.Start(); }