所以我刚刚开始使用Task Parallel Library
,我开始在代码执行时看到imrpovement。现在我开始并行启动三个方法,每个方法返回true
或false
,以确定某个用户是否有一些产品出现在他的个人资料中:
List<bool> hasProducts = new List<bool>();
List<Task> tasks = new List<Task>() {
Task.Factory.StartNew(() => {
hasProducts.Add(HasDeposits(clientId));
}),
Task.Factory.StartNew(() => {
hasProducts.Add(HasAccounts(clientId));
}),
Task.Factory.StartNew(() => {
hasProducts.Add(HasBankSafes(clientId));
})
};
Task.WaitAll(tasks.ToArray());
client.hasProducts = hasProducts.Where(p => p == true).Any();
这比以非并行方式执行方法更好,更快。然而,在我目前的情况下,我真正想知道的(正如你从这部分可以看到的那样 - hasProducts.Where(p => p == true).Any();
)并不是客户拥有的产品或产品数量。如果用户的姓名是Any
产品,我会非常谨慎。因此,除非用户没有任何与他相关的产品,否则我认为如果我在结果返回true时停止执行,我将获得最佳性能。
话虽如此,我想要的是,如何更改此代码以便在任何时候停止执行,任何方法都返回true,以及如何确定方法已返回{{1所以我可以将它分配给true
值,或者所有方法都已完成执行并且它们中的ll返回false?
答案 0 :(得分:0)
请检查this solution,我猜这与您的情况类似,成功时也会返回true。它使用TaskCompletionSource。
另一个解决方案是使用Lee Gary提到的取消令牌,throws an OperationCanceledException