我有一个c#wcf网络服务和一个c#客户端,它可以调用Web服务,该服务工作正常并且有一个类似下面的方案,我无法弄明白该怎么做。
在这种情况下,我在c#client中有2个方法,因为第一种方法会占用更多时间,而客户端不知道wcf web服务的响应会花多长时间,所以我们实现了第二种方法给出第一个方法调用的状态(说第一个方法总共有10个任务,当前正在执行1或2或3等)。现在我不知道调用如何进入第二种方法,因为第一种方法还没有完成,因为这两种方法都必须在同一个客户端。任何人都可以帮忙解决这个问题。
答案 0 :(得分:2)
解决此类问题的最佳方法是跨多个不同的WCF方法拆分任务,将调用链接起来。例如:
而不是这样做(只是一个概念证明):
serviceClient = new MyWCFClient();
serviceClient.TaskThatTakesForeverCompleted += (s,e) => { /*I'm done !*/ };
serviceClient.TaskThatTakesForeverAsync();
你最终会这样做:
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 */ }
当然,这可能不适用于您的情况,但很长的任务可以以这种方式拆分。
警告:这种实现绝对是不是最佳实践,因为您会发现自己有一堆必须以固定顺序调用的方法(FirstTask必须是第一个,然后是SecondTask,依此类推)但最终它将处理知道服务正在做什么的问题。
解释起来真的比理解起来更难,所需要的只是摆弄它是一个非常简单的逻辑。
注意:如果您没有异步调用,请按以下方式启用它们:
答案 1 :(得分:1)
如果我理解正确...您需要实现异步调用。 默认情况下,WCF中的所有调用都是同步的。
您现在拥有的是同步调用。:
您需要的是:
Method2
2.1验证请求是否正确形成
2.2创建一个带有工作过程的线程
2.3返回true(表示确定,我已将您的请求排队)
2.4 Method1继续做其中的事情。
然后你有两个选择:
3A。当Method2完成时,它会调用客户端中的另一个方法进行报告 它已经完成(在客户端说方法3)
3B。 Method1查询Server中的另一个方法(在Server中的Say4中查看) 任务每隔x秒进行一次,并在屏幕上显示或做任何想做的事情直到完成。
您可以查看此MSDN link,了解如何在WCF中实现异步方法。