1

WaitAny 呼び出しが有効なハンドル インデックスを返すが、Proxy.End 呼び出しがブロックされるという状況に遭遇した人はいますか? または、これをデバッグするための推奨事項または最適な方法があります-トレース、パフォーマンスカウンター(最大パーセンテージを確認するため)、どこでもログを記録してみました

テスト シナリオ: 2 非同期。リクエストは送信され (完全な実装にはもう少しあります)、最初の Proxy.End 呼び出しは正常に返されますが、後続のブロックはブロックされます。WCF トレースを確認しましたが、特に興味深いものはありません。同じプロセスとリモート マシンに存在するエンドポイントを自己クエリしていることに注意してください (= 2 つの非同期要求)

私が見る限り、両方のクエリのサービス実装側で呼び出しが行われていますが、後続の終了呼び出しでブロックされるだけです。ただし、リクエストをリモートマシンに送信しているか、それ自体に送信しているかに関係なく、1回の呼び出しで機能するようです。そのため、複数のクエリまたはロックアップを引き起こすその他の要因と関係があります。

さまざまな「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 層のセットアップですが、問題はこの 2 層が 3 層を呼び出すことに分離されています - コールバックは 2 層から 1 層に移動し、削除されましたこのテストでは)。考え?

4

1 に答える 1

0

コメントに残した解決策に固執します。宛先が異なる aysnc 呼び出しにコールバックを連鎖させないようにするだけです (プロキシなど)。

于 2011-06-29T09:20:38.857 に答える