Я разрабатываю интерфейс веб-сервиса для использования между устройством Windows CE и ПК. Устройство Windows CE - это сервер, а ПК - клиент.
Я решил использовать библиотеку gSOAP для реализации сервера, и я использую .NET / C # для клиента. Я следовал подходу, описанному здесь , и все работает хорошо.
Мой вопрос о том, как наилучшим образом реализовать асинхронный обратный вызов / событие с сервера на клиент. Я могу думать о двух методах:
- Непрерывный опрос сервера на наличие активных событий
- Метод блокировки, который сохраняет соединение открытым, пока не произойдет событие
В настоящее время я выбрал вариант 2, и, похоже, он работает хорошо. Я использую асинхронный метод в клиенте и, следовательно, получаю обратный вызов, когда метод завершается, то есть когда происходит событие на устройстве Windows CE. Затем я немедленно снова вызываю тот же метод, чтобы он был готов к следующему событию.
Пример метода сервера (без обработки ошибок):
int ns__WaitForEvent(struct soap* soap, int *eventId)
{
WaitForSingleObject(hMyServerEvent, INFINITE);
*eventId = GetCurrentEventId();
return SOAP_OK;
}
Пример клиента (без обработки ошибок):
private void SubscribeToServerEvents()
{
var server = new MyMethods.ServicePortTypeClient(
new BasicHttpBinding(),
new EndpointAddress(myIpAddress));
AsyncCallback cb = this.Callback;
server.BeginWaitForEvent(cb, server);
}
private void Callback(IAsyncResult ar)
{
var server = (MyMethods.ServicePortType)ar.AsyncState;
var result = server.EndWaitForEvent(ar);
// Do stuff with result
}
Сервер должен быть многопоточным, чтобы этот подход работал, и количество клиентов должно быть ограничено, чтобы на сервере не было большого количества потоков, зависающих с методами блокировки. В моем случае ни одна из этих проблем не является проблемой - просто настроить многопоточный сервер с использованием gSOAP, и к каждому серверу будет подключен только один клиент (которым я управляю).
Есть ли существенные недостатки этого подхода? Можете ли вы предложить лучшее решение?