1

有没有人遇到过 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 层已被删除在这个测试中)。想法?

4

1 回答 1

0

坚持我在评论中留下的解决方案。只需避免将回调链接到具有不同目的地(即代理)的 aysnc 调用

于 2011-06-29T09:20:38.857 回答