有没有人遇到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层设置,但问题是隔离到第二层调用第三层 - 回调从第二层到第一层已在本次测试中删除)。想法?
答案 0 :(得分:0)
坚持我在评论中留下的解决方案。只需避免将回调链接到具有不同目的地(即代理)的aysnc调用