Позвольте мне привести пример попытки связать два рабочих процесса друг с другом.
- Сначала вам нужно написать хост.Это чрезвычайно загруженное предложение, потому что для двух хостов WF, чтобы общаться друг с другом, вам также необходимо знать WCF и все гибкие концепции потоков.
- Тогда ваш WF должен будет общаться с другими WFчерез хозяев.Это имеет смысл, потому что WF не продолжает работать в памяти в течение 3 месяцев, когда он ожидает, что другой WF отправит событие.WF находится в базе данных, и связь происходит через хосты.
- Хорошо, даже для более простых сценариев, для локального внутрипроцессного взаимодействия у вас есть действие CallExternalMethod и действия HandleExternalEvent.Даже в этом случае вам нужно общаться через хост, потому что WF мог быть пассивирован в базу данных.Поэтому, чтобы сделать это, вы должны не забыть сделать 3 вещи, украсить свой интерфейс с помощью ExternalDataExchangeAttribute, eventargs должен быть производным от ExternalDataEventArgs, а args события сериализуемы.
- Если вы запутались в любом изэлементы в # 3, вы получите очень не интуитивно понятное «InvalidOperationException».Конечно, в сообщении говорится: «Сервис не реализует интерфейс с атрибутом ExternalDataExchange», но только после того, как вы посмотрите на внутреннее исключение, вы действительно узнаете, что произошло - то есть вы забыли сделать его сериализуемым.DOH!Но я пометил его как сериализуемый.На самом деле все должно быть сериализуемо, даже отправитель.
- Затем необходимо подключить действия WF через соответствующие имена интерфейсов и имена методов, которые вы используете для связи.
- Наконец, длядаже внутрипроцессное взаимодействие с WF необходимо помнить о добавлении службы в ExternalDataExchangeService, а не о среде выполнения WF.В противном случае это будет выглядеть так, будто никто не подписывается на событие.Не говоря уже о том, что это одна из тех ошибок, которая на самом деле не выдает ошибку.то есть трудно отследить!
Итак, вкратце, для упрощенного сценария попытки взаимодействия двух рабочих процессов вам нужно хорошо разбираться в следующем:
* Написание приложений для Windows (для хоста), * Потоки, * WCF, * Концепции ООП, * Все концепции сериализации, * Множество подробностей о подключении и неинтуитивности самого WF, * Навыки отладки ниндзя.
Источник: http://blah.winsmarts.com/2008-2-I've_been_here_before.aspx