1

我有 ac# wcf web 服务和 ac# 客户端,它们调用运行正常的 web 服务,并且有一个像下面这样的场景,我无法弄清楚如何去做。

情况就是这样,我在 c# 客户端中有 2 个方法,因为第一种方法会花费更多时间,而客户端不知道发生了什么,因为来自 wcf Web 服务的响应需要很长时间,所以我们实现了第二种方法,它给出了状态第一个方法调用的时间(说第一个方法总共有 10 个任务,当前正在执行 1 个或 2 个或 3 个等)。现在我不知道调用如何转到第二种方法,因为第一种方法尚未完成,并且两种方法都必须在同一个客户端中。任何人都可以帮助解决这个问题。

4

2 回答 2

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,依此类推)但是在最后它将处理知道服务在做什么的问题。

这真的比理解更难解释,所需要的只是一点点摆弄它是一个非常简单的逻辑。

注意:如果您没有异步调用,请以这种方式启用它们:

  • 右键单击服务引用
  • “配置服务参考”
  • 选中“生成异步操作”,不选中“生成消息合同”,其他一切保持原样
  • 现在您可以随意使用异步调用了
于 2012-06-27T15:34:08.493 回答
1

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

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

  1. Method1 (Client) 调用 Method2 (Server) 来完成任务。
  2. Method1 等待很长时间,直到 Method2 完成
  3. 方法 1 从方法 2 接收一个真值(或其他)
  4. 方法1可以继续做事。

你需要的是:

  1. Method1(客户端)调用 Method2(服务器)
  2. 方法2

    2.1 验证请求格式正确

    2.2 创建一个带工作进程的线程

    2.3 返回 true (这意味着好的,我已将您的请求排队)

    2.4 Method1 继续做它的事情。

然后你有两个选择:

3A。当 Method2 完成时,它会调用 Client 中的另一个方法来报告它已经完成(在 Client 中说方法 3)

3B。Method1 查询服务器中的另一个方法(例如服务器中的 Method4)以每隔 x 秒查看任务的进度并将其显示在屏幕上或执行任何它想要的操作,直到完成。

您可以查看此MSDN 链接,了解如何在 WCF 中实现异步方法。

于 2012-06-27T15:33:50.897 回答