запуск WCF в окнах форм - PullRequest
       2

запуск WCF в окнах форм

2 голосов
/ 24 октября 2010

У меня есть программа, работающая как клиент и сервер.Я использую службы wcf с BasicHttpBinding, и программа работает в консольном приложении.

Когда я переместил код в приложение Windows Form, все перестало работать.Когда клиентская сторона вызывает одну операцию, она не возвращается.Когда вызывается какая-либо операция на стороне сервера, это вызывает задержку вызова.

Я решил проблему с перемещением кода клиента и сервера в выделенный поток.
Кажется, что поток, отвечающий за обработку событий окна (владелец формы), не может быть тем же, что и экземпляры объекта ServiceHost.
Может кто-нибудь сказать мне, почему?

Спасибо

PS: я использую .Net 3.5 и Windows Vista

1 Ответ

3 голосов
/ 24 октября 2010

Мой оригинальный ответ был выключен. После некоторого исследования вот настоящая причина и ссылки:

Это потому, что вы запустили свой WCF ServiceHost в потоке пользовательского интерфейса.

Как известно любому, кто занимался многопоточным программированием пользовательского интерфейса в Windows, вы не можете обновить пользовательский интерфейс без синхронизации обратно с потоком пользовательского интерфейса, используя что-то вроде метода Control.Invoke.

По умолчанию WCF ServiceHost обрабатывает все запросы в своих собственных потоках из пула потоков. Однако при запуске WCF ServiceHost в потоке пользовательского интерфейса WCF обнаруживает, что поток пользовательского интерфейса имеет связанный с ним SynchronizationContext. WCF обнаруживает это и вместо того, чтобы использовать пул потоков для обработки запроса, отправляет все входящие запросы в поток пользовательского интерфейса. Это объясняется тем, что код компонента WCF-сервера может безопасно обновлять интерфейс.

Таким образом, даже если ваша служба WCF может вообще не взаимодействовать с пользовательским интерфейсом, WCF будет использовать этот механизм из-за запуска в потоке пользовательского интерфейса.

Простое исправление - применить атрибут ServiceBehavior, для которого UseSynchronizationContext имеет значение false. Или запустите ServiceHost в другом потоке (как вы обнаружили).

Вот еще несколько деталей: http://bytes.com/topic/net/answers/750778-wcf-inproc-client-server-main-thread-client-call-hangs
http://www.softinsight.com/bnoyes/PermaLink.aspx?guid=4bea53fa-2553-4d7b-bfe2-b0f0e9d11d0a

Извините за оригинальные заблуждения. Надеюсь, это поможет.

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