我正在设计一个在 Windows CE 设备和 PC 之间使用的 web 服务接口。Windows CE 设备是服务器,PC 是客户端。
我决定使用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 设置多线程服务器很简单,并且每台服务器都只会有一个客户端(我控制它)。
这种方法有什么明显的缺点吗?您能提出更好的解决方案吗?