1

我在 ServiceA 上有一个需要从 ServiceB 调用的方法。该方法需要 5 分钟以上的时间来执行,我不关心它的返回值。(该方法的输出以另一种方式处理)

我已经IServiceA像这样设置了我的方法:

[OneWay]
Task LongRunningMethod(int param1);

然而,这似乎没有运行,因为我得到System.TimeoutException: This can happen if message is dropped when service is busy or its long running operation and taking more time than configured Operation Timeout.

一种选择是增加超时时间,但似乎应该有更好的方法。有没有?

4

1 回答 1

2

对于触发后忘记长时间运行的操作,最好的解决方案是使用消息总线作为中间件来处理两个进程之间的这种依赖关系。

要在没有中间件的情况下做你想做的事,你的调用者将不得不担心很多事情,比如:超时(如你的情况)、交付保证(确认)、服务可用性、异常等等。

对于中间件,您的应用程序逻辑唯一需要担心的是交付保证,其余的应该由中间件和接收者处理。

有很多选择,例如:

  • Azure 服务总线
  • Azure 存储队列
  • MSMQ
  • 事件中心
  • 等等。

我不建议像许多地方建议的那样使用 SF Communication、Task.Run()、Threads 变通方法,因为它们只会给您带来额外的工作,并且不会像中间件方法那样顺利运行。

于 2018-06-12T09:13:00.037 回答