Я создал приложение WCF, и в нескольких местах я использую BeginInvoke для асинхронного запуска методов. В некоторых местах он асинхронен, а в других - синхронно. Поскольку система довольно сложная, я надеялся просто бросить этот вопрос высокого уровня там, надеясь, что кто-то знает причину, по которой BeginInvoke будет вынужден работать синхронно.Почему мой BeginInvoke работает синхронно
Возможные причины я Рассмотренные и считают, не являются причиной:
- Я выбежал из Threadpool темы - Я думаю, что на пике я использую менее 20 потоков.
- Я использую блокировки через эти потоки останавливая их одновременно расстрелы - синхронизация не используется, так как каждый вызов к методу на отдельном WCF ServiceHost
- асинхронного метод родительского (который определенно работает асинхронно) вызывает много детей BeginInvokes и вас не может встраивать асинхронные вызовы - я не думаю, что это ограничение
- Родительский асинхронный метод сам по себе является частью WCF ServiceHost, который является InstanceContextMode.PerSession, и есть некоторые ограничения на его вложение асинхронных вызовов. Опять же, я не знаю Так думает, но FYI
- Каждый вызываемый ребенок является (отличным от родителя) WCF ServiceHost, метод которого я звоню, является инстансом e того же ServiceType и запускается как InstanceContextMode.Single и ConcurrencyMode.Single. - Значит ли это каким-то образом удара при вызове подпрограммы из работы тех асинхронно (я не понимаю, почему это было, но на всякий случай)
Любые идеи/решения очень ценятся
Можете ли вы рассказать нам, как вы пришли к выводу, что они работают синхронно? Возможно, вызывающий поток блокируется во время их завершения? –
'BeginInvoke' - это« широкое имя ». К какому BeginInvoke вы имеете в виду? 'Control.BeginInvoke'? 'Delegate.BeginInvoke'? 'Dispatcher.BeginInvoke'? или другой? Следующий вопрос - какие потоки используются, я имею в виду, какой поток (ы) вызывает его и какие потоки являются целями? любые контексты синхронизации используются? пользовательские потоки с сообщениями или без? Задачи или библиотека TPL?Пользовательские диспетчеры или планировщики? (....) на самом деле, обрезка и показ кода может быть быстрее, чем опросить вас за подробностями. – quetzalcoatl
Ron Beyer: код не блокируется, он использует проверку IsCompleted в цикле, чтобы увидеть, когда вызывать EndInvoke. Я знаю, что это синхронно, потому что я допрашиваю статус звонков каждые 10 секунд, и я вижу из журналов, что все эти опросы происходят до того, как мой код сможет проверить первый статус IsCompleted. – pogpogoSE