【发布时间】:2011-10-05 09:02:01
【问题描述】:
我正在设计一个在 Windows CE 设备和 PC 之间使用的 Web 服务接口。 Windows CE 设备为服务器,PC 为客户端。
我决定使用gSOAP 库来实现服务器,并且我使用.NET/C# 作为客户端。我遵循了here 描述的方法,一切正常。
我的问题是关于如何最好地实现从服务器到客户端的异步回调/事件。我可以想到两种方法:
- 不断轮询服务器以获取活动事件
- 一种在事件发生之前保持连接打开的阻塞方法
我目前选择了选项 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 设置多线程服务器很简单,并且每台服务器都只会有一个客户端(我控制它)。
这种方法有什么明显的缺点吗?您能提出更好的解决方案吗?
【问题讨论】:
-
我能想到的唯一缺点是,如果它们一个接一个地直接跟随,你可能会失去一些事件。如果你不关心这个,那应该没问题。
-
为了简单起见,我在示例中使用了一个事件,但在我的实现中,我将使用带有消息队列句柄的 WaitForSingleObject,然后在队列的前面返回事件。这应该可以防止丢失事件。
-
那我觉得你应该没有什么大问题。
标签: c# .net web-services windows-ce gsoap