C# 从gSOAP服务器进行异步回调/事件的最佳方法是什么?
我正在设计一个用于Windows CE设备和PC之间的Web服务接口。Windows CE设备是服务器,PC是客户端 我已经决定使用这个库来实现服务器,而客户端使用.NET/C。我遵循了所描述的方法,一切都很好 我的问题是如何最好地实现从服务器到客户端的异步回调/事件。我可以想出两种方法:C# 从gSOAP服务器进行异步回调/事件的最佳方法是什么?,c#,.net,web-services,windows-ce,gsoap,C#,.net,Web Services,Windows Ce,Gsoap,我正在设计一个用于Windows CE设备和PC之间的Web服务接口。Windows CE设备是服务器,PC是客户端 我已经决定使用这个库来实现服务器,而客户端使用.NET/C。我遵循了所描述的方法,一切都很好 我的问题是如何最好地实现从服务器到客户端的异步回调/事件。我可以想出两种方法: 持续轮询服务器以查找活动事件 一种阻塞方法,在事件发生之前保持连接打开 我目前选择了选项2,看起来效果不错。我在客户机中使用异步方法,因此在该方法完成时(即Windows CE设备上发生事件时)会收到回调。然
这种方法有什么明显的缺点吗?你能推荐一个更好的解决方案吗?我建议将WinCE设备变成一个网络客户端,而不是一个网络服务器,并将PC变成一个服务器,当客户端发生什么事情时,它会得到通知。这种方法更自然,您仍然可以将gSoap用于soap客户端。在PC上,您应该安装Apache或IIS之类的web服务器,或者您可以制作一个Windows服务器来承载嵌入式light web服务器。我能想到的唯一缺点是,如果事件一个接一个地发生,您可能会丢失一些事件。如果您不关心这一点,那么应该可以。为了简单起见,我在示例中使用了一个事件,但在我的实现中,我将使用带有消息队列句柄的WaitForSingleObject,然后在队列前面返回事件。这应该可以防止丢失事件。那么我认为你不应该有任何严重的问题。我不认为这对我的设置不起作用。该设备是一个数据采集单元,由PC上的应用程序控制,大部分通信将由PC应用程序启动。好的,但我仍然认为使用阻塞方法仅保持连接打开是不对的。Gmail/Yahoo webmail客户端如何让您知道新邮件已经到达?通过AJAX进行某种形式的轮询。这也是困扰我的原因,这就是我问这个问题的原因。:-)我认为移动推送通知(Android、iOS等)是通过不断向服务器打开套接字来实现的,但它们可能使用比阻塞方法更聪明的方法……连接不会立即关闭,它有一个可以配置的生存时间(当然,它可以在每次通话后立即关闭,但不会产生效果),所以你不必太担心这个问题。邮件网络客户端有一个自适应轮询,他们每15秒检查一次,比如说有一封新的电子邮件,如果连接中断没有意义消耗CPU,它将在20秒后重新请求,以此类推。推送邮件通知我想这与电话接线员也有关系。
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
}