WCF Асинхронный тупик?

Кто-нибудь сталкивался с ситуацией, когда вызов 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-уровневая настройка, но проблема изолирована от этого 2-го уровня, вызывающего 3-й уровень - обратные вызовы переходят со 2-го уровня на 1-й уровень, которые были удалены в этом тесте). Мысли?

1 ответ

Решение

Придерживаясь решения я оставил в своем комментарии. Просто избегайте связывания обратного вызова с вызовами aysnc, которые имеют разные пункты назначения (например, прокси)

Другие вопросы по тегам