Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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#客户端调用c#wcf Web服务_C#_Wcf_Parallel Processing_Httpwebrequest - Fatal编程技术网

从c#客户端调用c#wcf Web服务

从c#客户端调用c#wcf Web服务,c#,wcf,parallel-processing,httpwebrequest,C#,Wcf,Parallel Processing,Httpwebrequest,我有一个c#wcf web服务和一个c#客户端,它可以调用工作正常的web服务,并且有一个类似下面这样的场景,我无法理解如何执行 在这种情况下,我在c#client中有两个方法,因为第一个方法会花费更多的时间,而客户端不知道wcf web服务的响应会花费很长时间,所以我们实现了第二个方法,它给出了第一个方法调用的状态(表示第一种方法总共有10个任务,目前正在执行1个、2个或3个等).现在,我不知道如何调用第二个方法,因为第一个方法尚未完成,而且两个方法必须在同一个客户端中。请任何人对此提供帮助。

我有一个c#wcf web服务和一个c#客户端,它可以调用工作正常的web服务,并且有一个类似下面这样的场景,我无法理解如何执行


在这种情况下,我在c#client中有两个方法,因为第一个方法会花费更多的时间,而客户端不知道wcf web服务的响应会花费很长时间,所以我们实现了第二个方法,它给出了第一个方法调用的状态(表示第一种方法总共有10个任务,目前正在执行1个、2个或3个等).现在,我不知道如何调用第二个方法,因为第一个方法尚未完成,而且两个方法必须在同一个客户端中。请任何人对此提供帮助。

如果我理解正确……您需要实现异步调用。 默认情况下,在WCF中,所有调用都是同步的

您现在拥有的是一个同步调用:

  • Method1(客户端)调用Method2(服务器)完成任务
  • Method1等待很长时间,直到Method2完成
  • 方法1从方法2接收一个true(或其他任何值)
  • 方法1可以继续做事情
  • 您需要的是:

  • 方法1(客户端)调用方法2(服务器)
  • 方法2

    2.1验证请求的格式是否正确

    2.2创建带有工作进程的线程

    2.3返回true(表示ok,我已将您的请求排队)

    2.4方法1继续做自己的事情

  • 那么您有两个选择:

    3A。当Method2完成时,它调用客户端中的另一个方法进行报告 它已经完成(比如客户端中的方法3)

    3B.Method1在服务器中查询另一个方法(例如服务器中的Method4)以查看 每x秒显示一次任务进度,并在屏幕上显示它,或者做任何它想做的事情,直到完成为止


    关于如何在WCF中实现异步方法,您可以对此进行检查。

    解决此类问题的最佳方法是将任务分割到多个不同的WCF方法中,并链接调用。示例:

    而不是这样做(只是概念证明):

    你最终会这样做:

    serviceClient = new MyWCFClient();
    serviceClient.FirstTaskCompleted += (s,e) => { /*first task done!*/ serviceClient.SecondTaskAsync(); };
    serviceClient.SecondTaskCompleted += (s,e) => { /*and so on... */ };
    ...
    serviceClient.FirstTaskAsync();
    
    在服务器端,您可以这样实现它:

    [OperationContract]
    public <return type> FirstTask() { /* code */}
    [OperationContract]
    public <return type> SecondTask() { /* more code */ }
    
    [运营合同]
    public FirstTask(){/*code*/}
    [经营合同]
    public SecondTask(){/*更多代码*/}
    
    当然,这可能不适用于您的案例,但很长的任务可以以这种方式分割

    警告:这种实现肯定不是最佳实践,因为您会发现自己有一大堆方法必须按固定顺序调用(FirstTask必须是第一个,然后是第二个Task,依此类推),但最终它将处理知道服务在做什么的问题

    事实上,解释比理解更难,只需稍加摆弄,这是一个相当简单的逻辑

    注意:如果没有异步调用,请通过以下方式启用它们:

    • 右键单击服务引用
    • “配置服务引用”
    • 选中“生成异步操作”,将“生成消息契约”保留为未选中状态,其他一切保持原样
    • 现在您可以使用异步调用了

    是的,我已经实现了所有这些东西,现在我需要知道的是如何实现上面答案中的3B点(当客户端的方法1仍在从服务器运行方法2以获得进展时,客户端的方法3应该从服务器调用方法4)。感谢msdn链接,但我不太明白如何在客户端实现您上面提到的3B点。您能提供一些示例代码吗?我没有理解您上面解释的内容,但我认为您没有正确理解我的问题。客户端的方法1和方法2将调用方法3和方法4。方法1调用方法3和获取响应将花费很长时间,因此我希望方法2调用方法4以获取状态,即使方法1尚未完成。您能否详细解释一下您的答案。正如您所说的“serviceClient.FirstTaskCompleted+=(s,e)=>,我没有得到。每个WCF异步操作都实现一个“completed”您可以处理的事件,以便在完成调用时执行某些操作。将您的长任务拆分为多个方法,您可以更轻松地知道已完成的操作和将要发生的操作。我用一个示例扩展了答案OK我明白了您所说的,但现在我使用以下语句生成了客户端$bin>SvcUtil/n:/a/tcv:version35生成异步客户端是否正确
    [OperationContract]
    public <return type> FirstTask() { /* code */}
    [OperationContract]
    public <return type> SecondTask() { /* more code */ }