Асинхронный вызов для службы WCF, размещенной в службе Windows
Я размещал службу WCF в службе Windows. У меня есть консольное приложение, для которого я добавил ссылку на службу WCF и сгенерировал для нее клиент.
Я могу сделать синхронизированный вызов службы, но асинхронный вызов не работает. Если я присоединяю серверный процесс, он вообще не попадает в сервис.
client= new ServiceClient();
client.DoSomething();//Works fine
client.DoSomethingAsync()//Doesnot work
Это известная проблема?
4 ответа
A synccall, вероятно, будет запущен в фоновом режиме. Так что может случиться так, что ваш асинхронный поток прекращает работу, потому что основной поток завершил свою обработку.
Если у вас нет логики после выполнения этого вызова для ожидания ответа или продолжения какой-либо другой работы в основном потоке, фоновый поток может не иметь времени для создания до выхода из приложения.
Это легко проверить, добавив Thread.Sleep после асинхронного вызова.
client.DoSomethingAsync();
Thread.Sleep(1000);
Признаком этого является то, что ваша служба неожиданно запускается / останавливается, и Windows выдает ошибку.
Когда вы генерировали клиент, ставили ли вы флажок "Генерация асинхронных операций"?
Если у вас есть звонок в
client.DoSomethingAsync()//Doesnot work
тогда вы указали обработчик для события завершения обратного вызова??
public event DoSomethingCompletedEventHandler DoSomethingCompleted;
Что происходит, когда асинхронный вызов отключается, но как он отправит вам обратно какие-либо результаты? Вам нужно будет предоставить метод-обработчик для этого - подключите его к DoSomethingCompleted
обработчик события! В этом методе вы получите результаты асинхронного вызова и можете делать с ними все, что вам нужно.
Марк
Исходя из опубликованного кода, я предполагаю, что вы не настроили обработчики для обработки ответа от асинхронного метода. Вам понадобится что-то вроде примера внизу этого сообщения 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