Асинхронный вызов для службы WCF, размещенной в службе Windows - PullRequest
1 голос
/ 21 июля 2009

Я разместил службу WCF в службе Windows. У меня есть консольное приложение, для которого я добавил ссылку на службу WCF и сгенерировал для нее клиент.

Я могу позвонить в службу синхронизации, но асинхронный вызов не работает. Если я присоединяю серверный процесс, он вообще не срабатывает.

client= new ServiceClient();
client.DoSomething();//Works fine

client.DoSomethingAsync()//Doesnot work

Это известная проблема?

Ответы [ 4 ]

1 голос
/ 21 июля 2009

Asynccall, вероятно, будет запущен в фоновом рабочем потоке. Так что может случиться так, что ваш асинхронный поток прекращает работу, потому что поток переднего плана завершил свою обработку.

Если у вас нет логики после выполнения этого вызова для ожидания ответа или продолжения какой-либо другой работы в основном потоке, фоновый поток может не иметь времени для создания до выхода из приложения.

Это легко проверить, добавив Thread.Sleep после асинхронного вызова.

client.DoSomethingAsync();
Thread.Sleep(1000);

Симптомом этого является то, что ваша служба неожиданно запускается / останавливается, и Windows выдает ошибку.

0 голосов
/ 21 июля 2009

Если у вас есть вызов на

client.DoSomethingAsync()//Doesnot work

, тогда вы указали обработчик для события завершения обратного вызова ??но как бы он вернул вам какие-либо результаты?Для этого вам нужно предоставить метод-обработчик - подключите его к обработчику событий DoSomethingCompleted!В этом методе вы получите результаты асинхронного вызова и можете делать с ними все, что вам нужно.

Marc

0 голосов
/ 21 июля 2009

Исходя из опубликованного кода, я предполагаю, что вы не настроили обработчики для обработки ответа от асинхронного метода. Вам понадобится что-то вроде примера внизу этого сообщения MSDN , где вы используете AddHanlder для обработки ответа.

Перед асинхронным вызовом вы должны сделать что-то похожее на следующее:

AddHandler client.DoSomethingCompleted, AddressOf DoSomethingCallback

Методом работы с Otome:

Private Shared Sub DoSomethingCallback(ByVal sender As Object, ByVal e As DoSomethingCompletedEventArgs)

        'Do something with e.Result
        MsgBox e.Result

End Sub
0 голосов
/ 21 июля 2009

Когда вы генерировали клиент, ставили ли вы флажок, чтобы указать «Генерировать асинхронные операции»?

...