从c#客户端调用c#wcf Web服务
我有一个c#wcf web服务和一个c#客户端,它可以调用工作正常的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#client中有两个方法,因为第一个方法会花费更多的时间,而客户端不知道wcf web服务的响应会花费很长时间,所以我们实现了第二个方法,它给出了第一个方法调用的状态(表示第一种方法总共有10个任务,目前正在执行1个、2个或3个等).现在,我不知道如何调用第二个方法,因为第一个方法尚未完成,而且两个方法必须在同一个客户端中。请任何人对此提供帮助。如果我理解正确……您需要实现异步调用。 默认情况下,在WCF中,所有调用都是同步的 您现在拥有的是一个同步调用:
关于如何在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,依此类推),但最终它将处理知道服务在做什么的问题
事实上,解释比理解更难,只需稍加摆弄,这是一个相当简单的逻辑
注意:如果没有异步调用,请通过以下方式启用它们:
- 右键单击服务引用
- “配置服务引用”
- 选中“生成异步操作”,将“生成消息契约”保留为未选中状态,其他一切保持原样
- 现在您可以使用异步调用了
[OperationContract]
public <return type> FirstTask() { /* code */}
[OperationContract]
public <return type> SecondTask() { /* more code */ }