Как я могу достичь этого сценария?
У меня есть служба WCF, размещенная в форме Windows, и всякий раз, когда клиент службы вызывает метод в службе, я хочу, чтобы служба могла писать сообщение в текстовое поле в форме окна.
Я думал, что сделаю мою службу WCF синглтон, передаю свою форму с помощью интерфейса, который реализует форма, в службу, а затем сохранит этот экземпляр. то когда клиент вызывает службу, я могу просто использовать экземпляр формы для записи в текстовое поле.
Я не могу этого сделать, конечно, поскольку я не могу передать форму в службу WCF.
Любые идеи или примеры кода?
Экземпляр службы и ваша форма Windows работают в двух отдельных потоках, и вы не можете просто обновить элемент пользовательского интерфейса в основном потоке пользовательского интерфейса из экземпляра службы.
Вам необходимо использовать контекст синхронизации и делегат, чтобы правильно и безопасно обновлять пользовательский интерфейс из потока обслуживания.
См. эта статья CodeProject - в середине автор говорит о "проблемах с потоками UI". Это в основном то, что вам нужно сделать:
SendOrPostCallback callback =
delegate (object state)
{
yourListBox.Add(state.ToString());
};
_uiSyncContext.Post(callback, guestName);
См. статью Juval Lowy MSDN " Контексты синхронизации WCF" для всестороннего введения в тему.
Хостинг службы WCF внутри приложения Winforms кажется мне довольно плохой идеей - прежде всего из-за всех этих проблем с потоками, а во-вторых, он будет работать только в том случае, если приложение winforms работает. Не могли бы вы поместить свою службу WCF в консольное приложение или службу Windows NT, а затем просто создать приложение мониторинга на основе Winforms, которое может проверять, например. таблицу базы данных для входящих сообщений или что-то еще?
Марк
Посмотрите этот SO ответ - насколько я понимаю, это в основном тот же вопрос.
Вы можете встраивать зависимости в службы WCF: вам просто нужно реализовать пользовательскую службу ServiceHostFactory, которая прокладывает все для вас.