gpt4 book ai didi

c#-4.0 - Parallel.Invoke - 异常处理

转载 作者:行者123 更新时间:2023-12-02 19:16:46 24 4
gpt4 key购买 nike

我的代码运行 4 个函数来向类填充信息(使用 Invoke),例如:

class Person
{
int Age;
string name;
long ID;
bool isVegeterian

public static Person GetPerson(int LocalID)
{
Person person;
Parallel.Invoke(() => {GetAgeFromWebServiceX(person)},
() => {GetNameFromWebServiceY(person)},
() => {GetIDFromWebServiceZ(person)},
() =>
{
// connect to my database and get information if vegeterian (using LocalID)
....
if (!person.isVegetrian)
return null
....
});
}
}

我的问题是:如果他不是素食主义者,我不能返回 null,但我希望能够停止所有线程,停止处理并只返回 null。如何实现?

最佳答案

要尽早退出 Parallel.Invoke,您必须做三件事:

  1. 将检测是否要提前退出的操作安排为第一个操作。然后会更早安排(也许是第一个,但这不能保证),这样您就会更快知道是否要退出。
  2. 当您检测到错误并捕获 AggregateException 时抛出异常,如 Jon 的回答所示。
  3. 使用取消 token 。然而,只有当您有机会检查他们的 IsCancellationRequested 时,这才有意义。属性(property)。

您的代码将如下所示:

var cts = new CancellationTokenSource();
try
{
Parallel.Invoke(
new ParallelOptions { CancellationToken = cts.Token },
() =>
{
if (!person.IsVegetarian)
{
cts.Cancel();
throw new PersonIsNotVegetarianException();
}
},
() => { GetAgeFromWebServiceX(person, cts.Token) },
() => { GetNameFromWebServiceY(person, cts.Token) },
() => { GetIDFromWebServiceZ(person, cts.Token) }
);
}
catch (AggregateException e)
{
var cause = e.InnerExceptions[0];
// Check if cause is a PersonIsNotVegetarianException.
}

但是,正如我所说,取消 token 只有在您可以检查时才有意义。因此,GetAgeFromWebServiceX 内部应该有机会检查取消 token 并提前退出,否则,将 token 传递给这些方法是没有意义的。

关于c#-4.0 - Parallel.Invoke - 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3724232/

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