解决此类问题的最佳方法是将任务拆分为多个不同的 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,依此类推)但是在最后它将处理知道服务在做什么的问题。
这真的比理解更难解释,所需要的只是一点点摆弄它是一个非常简单的逻辑。
注意:如果您没有异步调用,请以这种方式启用它们:
- 右键单击服务引用
- “配置服务参考”
- 选中“生成异步操作”,不选中“生成消息合同”,其他一切保持原样
- 现在您可以随意使用异步调用了