Parallel.ForEach并在找到第一个结果后突破

时间:2014-06-30 22:23:40

标签: c# c#-4.0 task-parallel-library parallel.foreach

我正在尝试在n个“门户”中的一个(最终是数据库)中找到用户,并根据用户的数据填充全局对象。找到用户后,我需要停止处理。因此,即使用户在多个门户中,我们也只需要使用我们找到的第一个门户,顺序无关紧要。我更好奇下面的方法是否可以接受,或者我是否忽略了什么?我很漂亮queryResult对象需要一个锁定机制,非常感谢任何建议。

        bool userFound = false;
        QueryResult queryResult = null;

        // Here, PortalInstance.Map is an IDictionary<int, PortalIntance>
        Parallel.ForEach(PortalInstance.Map, (p, state) =>
            {
                if(userFound)
                {
                    state.Stop();
                }

                PortalInstance p2 = p.Value;
                if(p2 != null)
                {
                    using (SomeWebService svc = new SomeWebService())
                    {
                        string queryText = String.Format("select Id, Email, AccountId from Member where Email = '{0}'", response.Attributes["mail"]);
                        QueryResult qr = svc.Query(queryText);
                        if(qr != null && qr.Records.Length > 0)
                        {
                            queryResult = qr;
                            userFound = true;   
                        }
                    }
                }
            });
        if(!userFound)
        {
            throw new Exception("User not found");
        }

编辑:关于'重复问题'方面,我更感兴趣的是上述代码是否足以满足全局queryResult变量,即,是否保证一旦设置了该值,并且状态.Break()方法调用另一个线程在返回之前无法更改它?我发现的其他问题都没有涉及到这方面。

0 个答案:

没有答案