Policy

var result = Policy.HandleResult(g => !IfNeedJumpOut(g))
                                                                .WaitAndRetry(times, n => TimeSpan.FromSeconds(0.1))
                                                                .Execute(() => STARletBMGResultFromOuttle(requestId).Result);

 

验证逻辑

  public DeviceQuestionResponseModel WaitBgiLimsResponse(string requestId)
        {
            DeviceQuestionResponseModel result = null;
            Policy.Timeout(3 * 60, TimeoutStrategy.Pessimistic)
                  .Execute(() =>
                  {
                      Policy.HandleResult(p => p)
                              .WaitAndRetryForever(n => TimeSpan.FromSeconds(1))
                                  .Execute(() =>
                                  {
                                      var response = STARletBMGResultFromOuttle(requestId);
                                      response.Wait();
                                      if (response?.Result == null)
                                          return true;
                                      else
                                      {
                                          result = response.Result;
                                          return false;
                                      }
                                  });
                  });
            return result;
        }

最好的逻辑

        public DeviceQuestionResponseModel WaitResponseFromLims(string requestId) 
        {
            TimeSpan interval = TimeSpan.FromSeconds(0.1);
            var times = (int)(TimeSpan.FromMinutes(3)/ interval);
            var result = Policy.HandleResult(g => !IfNeedJumpOut(g))
                                                                .WaitAndRetry(times, n => TimeSpan.FromSeconds(0.1))
                                                                .Execute(() => STARletBMGResultFromOuttle(requestId).Result);
            if (!IfNeedJumpOut(result))
                throw new TimeoutException("WaitResponseFromLims timeout.");
            return result;

        }

        private bool IfNeedJumpOut(DeviceQuestionResponseModel response)
        {
            if (response == null)
            {
                return false;
            }
            else 
            {
                return true;
            }
        }


        ///


        /// STARletBMGResultFromOuttle
        ///

        ///
        ///
        public async Task STARletBMGResultFromOuttle(string requestId)
        {
            var result = await _acquireBuff.IsReplyAsync(requestId);

            if (result != null && result.Responsed)
            {
                var row = await _acquireBuff.GetRaw(requestId);

                return !row.Responsed ? null
                    : new DeviceQuestionResponseModel()
                    {
                        Id = row.TaskId,
                        Attributes = JObject.Parse(row.ResponseAttribute).ToObject(),
                        CommandId = row.CommandId,
                        RequestId = row.RequestId,
                        Response = row.ResponseResult.ToString()
                    };
            }
            else
                return null;
        }

你可能感兴趣的:(C#)