DynamicInvoke на удаленном объекте работает асинхронно? - PullRequest
1 голос
/ 06 января 2009

Я унаследовал некоторый в основном код спагетти (комбинация C # / VB), который я пытаюсь понять здесь.

Похоже, что это действительно странная ситуация, когда есть два последовательных вызова для запуска событий для удаленного объекта, которые выполняются путем вызова метода DynamicInvoke делегата в форме:

delegate1.DynamicInvoke(args1);
// some code here
delegate2.DynamicInvoke(args2);

делегат1 и делегат2 оба ссылаются на методы в одном и том же удаленном объекте «подписчик».

Согласно всему, что я могу прочитать в документации , DynamicInvoke выглядит так, как будто он должен быть синхронным. Но я вижу своими глазами, когда я помещаю точки останова в удаленный процесс, что методы, на которые ссылаются делегат1 и делегат2, одновременно запускают в разных потоках.

Это еще одна "недокументированная функция" Microsoft? Я должен был ожидать этого? Любые объяснения, почему это должно быть? И если он предназначен для асинхронной работы, как DynamicInvoke может иметь возвращаемое значение?

Спасибо! Шауль

Ответы [ 2 ]

2 голосов
/ 06 января 2009

DynamicInvoke, безусловно, является синхронной операцией. Проблема в том, что делегат, на который он указывает, не должен быть синхронным. Например, следующий код вызовет Console.WriteLine () в асинхронном режиме.

Action write = () => Console.WriteLine("foo");
Action del1 = () => { ThreadPool.QueueUserWorkItem(write); }
...
del1.DynamicInvoke();

del1 будет выполняться синхронно, но при этом будет создан асинхронный рабочий элемент.

Я бы посмотрел код, выполняемый делегатом, и посмотрел бы, не скрывают ли они какую-то магию асин.

0 голосов
/ 07 января 2009

Мой главный совет - тщательно проверить стеки вызовов в двух ваших процессах.

Возможно ли, что ваш код "спагетти" действительно имеет обратный вызов. Ваш первый делегат вызывает ваш удаленный процесс, он перезванивает, а ваш второй делегат вызывается из вложенного обратного вызова?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...