我正在尝试在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()方法调用另一个线程在返回之前无法更改它?我发现的其他问题都没有涉及到这方面。