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, которые имеют разные пункты назначения (например, прокси)