当我从方法中获得某些结果时,如何停止执行任务

时间:2014-10-13 07:10:10

标签: c# task-parallel-library

所以我刚刚开始使用Task Parallel Library,我开始在代码执行时看到imrpovement。现在我开始并行启动三个方法,每个方法返回truefalse,以确定某个用户是否有一些产品出现在他的个人资料中:

                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?

1 个答案:

答案 0 :(得分:0)

请检查this solution,我猜这与您的情况类似,成功时也会返回true。它使用TaskCompletionSource。

另一个解决方案是使用Lee Gary提到的取消令牌,throws an OperationCanceledException