有没有人遇到过 WaitAny 调用返回有效句柄索引但 Proxy.End 调用阻塞的情况?或者有任何建议或如何最好地调试这个 - 尝试跟踪,性能计数器(检查最大百分比),到处记录
测试场景:2 异步。请求正在发出(完整实现还有更多内容),第一个 Proxy.End 调用成功返回,但随后的块。我检查了 WCF 跟踪,并没有看到任何特别有趣的东西。请注意,它正在自我查询存在于同一进程和远程机器中的端点(=2 个异步请求)
据我所见,这两个查询的调用都在服务实现端进行,但它只是阻塞了后续的结束调用。不过,它似乎只需要一个调用就可以工作,无论它是将请求发送到远程机器还是发送给它自己;所以这与多个查询或导致锁定的其他因素有关。
我尝试了不同的“concurrencymode”和“instancecontextmode”,但它似乎对结果没有任何影响。
这是解析句柄列表的内部代码的精简版本:
ValidationResults IValidationService.EndValidate()
{
var results = new ValidationResults();
if (_asyncResults.RemainingWaitHandles == null)
{
results.ReturnCode = AsyncResultEnum.NoMoreRequests;
return results;
}
var waitArray = _asyncResults.RemainingWaitHandles.ToArray();
if (waitArray.GetLength(0) > 0)
{
int handleIndex = WaitHandle.WaitAny(waitArray, _defaultTimeOut);
if (handleIndex == WaitHandle.WaitTimeout)
{
// Timeout on signal for all handles occurred
// Close proxies and return...
}
var asyncResult = _asyncResults.Results[handleIndex];
results.Results = asyncResult.Proxy.EndServerValidateGroups(asyncResult.AsyncResult);
asyncResult.Proxy.Close();
_asyncResults.Results.RemoveAt(handleIndex);
_asyncResults.RemainingWaitHandles.RemoveAt(handleIndex);
results.ReturnCode = AsyncResultEnum.Success;
return results;
}
results.ReturnCode = AsyncResultEnum.NoMoreRequests;
return results;
}
以及调用它的代码:
validateResult = validationService.EndValidateSuppression();
while (validateResult.ReturnCode == AsyncResultEnum.Success)
{
// Update progress step
//duplexContextChannel.ValidateGroupCallback(progressInfo);
validateResult = validationService.EndValidateSuppression();
}
我已经注释掉了启动节点上的回调(仅供参考,它实际上是一个 3 层设置,但问题被隔离到调用第 3 层的第 2 层 - 回调从第 2 层到第 1 层已被删除在这个测试中)。想法?