Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从gSOAP服务器进行异步回调/事件的最佳方法是什么?_C#_.net_Web Services_Windows Ce_Gsoap - Fatal编程技术网

C# 从gSOAP服务器进行异步回调/事件的最佳方法是什么?

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设备上发生事件时)会收到回调。然

我正在设计一个用于Windows CE设备和PC之间的Web服务接口。Windows CE设备是服务器,PC是客户端

我已经决定使用这个库来实现服务器,而客户端使用.NET/C。我遵循了所描述的方法,一切都很好

我的问题是如何最好地实现从服务器到客户端的异步回调/事件。我可以想出两种方法:

  • 持续轮询服务器以查找活动事件
  • 一种阻塞方法,在事件发生之前保持连接打开
  • 我目前选择了选项2,看起来效果不错。我在客户机中使用异步方法,因此在该方法完成时(即Windows CE设备上发生事件时)会收到回调。然后我立即再次调用相同的方法,以便为下一个事件做好准备

    示例服务器方法(无错误处理):

    示例客户端(无错误处理):

    服务器必须是多线程的,这种方法才能工作,并且客户端的数量应该受到限制,这样服务器就不会有大量线程挂在阻塞方法上。在我的例子中,这些问题都不是问题——使用gSOAP设置多线程服务器很简单,每个服务器上只会连接一个客户端(由我控制)


    这种方法有什么明显的缺点吗?你能推荐一个更好的解决方案吗?

    我建议将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
    }