var result = Policy.HandleResult<DeviceQuestionResponseModel>(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<bool>(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<DeviceQuestionResponseModel>(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;
}
}
/// <summary>
/// STARletBMGResultFromOuttle
/// </summary>
/// <param name="requestId"></param>
/// <returns></returns>
public async Task<DeviceQuestionResponseModel> 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<DeviceQuestionActionType>(),
CommandId = row.CommandId,
RequestId = row.RequestId,
Response = row.ResponseResult.ToString()
};
}
else
return null;
}