gpt4 book ai didi

asp.net - 如何在 WCF 服务中返回值后继续处理

转载 作者:行者123 更新时间:2023-12-02 14:19:48 25 4
gpt4 key购买 nike

我有一个 WCF 服务,该服务依次调用其他几个 Web 服务。这些服务按优先顺序排序,但并行调用。每个服务都会响应 true 或 false,当收到所有响应后,最优先的肯定将返回给客户端。

但是,在此期间的任何时候,最喜欢的服务都可能会做出积极的响应。此时继续查询其他服务已经没有意义了,所以我希望取消执行并将结果返回给客户端。

我能做的就这么多:

// Use parallelOptions to store the cancellation token
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
Parallel.ForEach<IntegrationObj>(externalServices, po, x =>
{
try
{
// Send requests
SendExternalRequest(x);
po.CancellationToken.ThrowIfCancellationRequested();
}
catch (OperationCanceledException e)
{
/// Don't throw an exception if the loop was cancelled
}
catch (Exception e)
{
LogError(e.Message);
}
});
if (positiveResponses.Count > 0) {
// Get the most preferred positive response and send it back to the client
res = positiveResponses.Where(
x => x.ID == PreferredServiceID)
.FirstOrDefault();
}
return res;

上面的代码是我的代码的一个非常简化的版本,但本质上它会检查每个响应以查看它是否是当前最首选的服务。如果是,则取消循环。

但是...以这种方式取消循环将等待所有已调用的服务完成后再终止循环。任何服务都有可能超时,这当然被视为负面因素。如果只有其中一个超时,我的响应时间就会额外增加 10 秒。

我想做的是以下其中一项:

  1. 将首选服务返回给客户端,然后继续处理来自已启动服务的响应(这纯粹是为了记录目的,以便我了解这些服务的正/负率)。
  2. 立即取消循环并忘记剩余的响应。理想情况下,我不想这样做,因为这意味着本来会做出积极回应的服务将不会被记录下来,这将影响他们的偏好评级。

所以我的问题是这样的:

我想要实现的目标可能吗?我意识到parallel.foreach可能不是完成这项工作的最佳工具,或者我可能无法在响应客户端后记录响应。最重要的要求是,当“获胜者”已经选出时,客户端可以收到快速响应,而不必等待服务响应。

最佳答案

当前的设置方式是您的所有服务都是并行启动的,但您的检查仅在所有服务完成后才会进行。
如果您想坚持使用 foreach 方法,您可以在 foreach 中编写 if 条件,这样如果服务首先完成,它将直接执行对肯定响应的检查,您可以做出相应的 react (返回值/杀死其他服务)。
请注意,这种方法有更多的线程不安全性,您必须小心(您从您的服务之一可能试图写入的列表中读取)。两个服务也可能同时完成,因此您的 if 语句会触发两次。

foreach 方法的另一种方法是为每个服务创建一个线程,将所有线程放入一个列表中,并在启动所有线程后立即启动一个 while 循环,以继续检查(在 sleep 过程中)是否已完成服务。这样,您可以通过中断 while 循环来在其他线程仍在运行时返回值。

关于asp.net - 如何在 WCF 服务中返回值后继续处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10334301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com