WCF异步死锁?

时间:2011-06-16 06:25:54

标签: wcf asynchronous iasyncresult

有没有人遇到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层设置,但问题是隔离到第二层调用第三层 - 回调从第二层到第一层已在本次测试中删除)。想法?

1 个答案:

答案 0 :(得分:0)

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