Асинхронный вызов для службы 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
Другие вопросы по тегам