private void CalculateOne(CalculationParameterForUnit inputData, ParallelLoopState loopState, long currentIndex) { ClientCallbackInformation client = null; try { client = this.GetNextClient(); if (_clients.Count < 1) { _result.Error = "Все клиенты отключились. Вычисления не закончены."; } else { lock (_result) { this._result.Result += client.Client.Calculate(inputData).Result; } } } #region catch exception catch (ArgumentNullException ex) { _result.Exception = ex; _result.Error = "Ошибочные данные от клиентов. Вычисления не закончены."; } catch (ArgumentException ex) { _result.Exception = ex; _result.Error = "Ошибочные данные от клиентов. Вычисления не закончены."; } catch (Exception ex) { _result.Exception = ex; _result.Error = ex.Message; } #endregion finally { if (client != null) { client.IsEvalable = true; } if (!string.IsNullOrWhiteSpace(_result.Error)) { _result.Error = string.Format("{0}{1}" , _result.Error , string.Format("{0}Вычисления прервались на {1} элементе.", Environment.NewLine, currentIndex)); loopState.Break(); } } }
private ClientCallbackInformation GetNextClient() { ClientCallbackInformation client = null; lock (_lockClient) { while (_clients.Count > 0 && client == null) { if (_clientIndex >= _clients.Count) { _clientIndex = 0; } if (_clients[_clientIndex].IsEvalable) { try { if (_clients[_clientIndex].Client.Ping()) { client = _clients[_clientIndex]; _clientIndex++; client.IsEvalable = false; break; } } #region catch exception catch (ObjectDisposedException) { _clients.Remove(_clients[_clientIndex]); _clientIndex--; } catch (CommunicationException) { _clients.Remove(_clients[_clientIndex]); _clientIndex--; } #endregion } } return(client); } }