惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
U
Unit 42
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
小众软件
小众软件
V
Visual Studio Blog
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
GbyAI
GbyAI
爱范儿
爱范儿
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
D
DataBreaches.Net
博客园_首页
D
Docker
A
About on SuperTechFans
G
Google Developers Blog
I
InfoQ
T
The Blog of Author Tim Ferriss
V
V2EX
博客园 - Franky

博客园 - 笑缘

Oxite开源内容管理平台 Informatica Data Quality英文培训文档 最近开始学习BI了 我们需要更团结 希望大家奔走先告(转) 学会忘记,学会原谅! .NET Framework 开源咯 软件项目团队有效性和五原则 提高程序的传输效率,减少带宽的占用,启用IIS6中GZip压缩 - 笑缘 - 博客园 分页存储过程(收藏) asp.net页面的生存周期 使用HttpContext的User属性来实现用户验证 Visual Studio Team System 2008 Setup 怎样让.Net2.0的Membership使用已存在的Sql Server2000/2005数据库(转) 五种提高 SQL 性能的方法(转。收藏) C#实现Web程序调用Windows程序的方法 SharePoint2007开发(二)Hello WebPart SharePoint2007开发(一)部署 获取Setup文件的运行路径 将数据库表中的数据生成Insert脚本的存储过程(改版)
C#异步多线程AD浏览器(一)
笑缘 · 2007-12-19 · via 博客园 - 笑缘

    最近在做一个MS的项目,我负责一个检索AD中的用户和组数据信息,这里把她作为一个例子给大家分享。
    首先从AD中查询并构造一个对象池,查询检索AD数据是非常耗费时间的,为了不至于让UI没有响应,我采用了使用后台线程来运行AD检索。下面是查询AD中所有组使用的代码:(顺便说一下,DirectorySearcher和SearchResultCollection是System.DirectoryServices下的成员,在使用前要把System.DirectoryServices.dll添加引用项目中)

 1 private static String[] GetAdGroupsFromAD()
 2        {
 3            DirectorySearcher srch = new DirectorySearcher();
 4
 5            const string query = "(&(objectCategory=group))";
 6
 7            srch.Filter = query;
 8
 9            SearchResultCollection sResult = srch.FindAll();
10
11            List<String> results = new List<string>();
12
13            if (null != sResult)
14            {
15                for (int i = 0; i < sResult.Count; i++)
16                {
17                    if (null != sResult[i].Properties["name"&& sResult[i].Properties["name"].Count == 1)
18                    {
19                        results.Add(sResult[i].Properties["name"][0as String);
20                    }

21                }

22            }

23            return results.ToArray();
24        }

这个查询在执行时是非常耗费时间的,由于查询并不是非常频繁的更改,所以我这里使用一个缓冲池来保存这些查询结果。
由于缓冲池最后会被异步的访问,可能会有多个线程同时访问她,不得不使用其他来保证这个缓冲池状态不被破坏。我采用创建一个锁来确保同一时间只能有一个线程访问。
private static Object m_groupPoolSync = new Object();
当向缓存池读写数据的时候会对groupPoolSync 对象的加锁。同时会有个全局标识来标识这个池是否已经初始化,这样如果已经有了需要的数据就可以跳过对AD的检索。

 1private static String[] GetAdGroups()
 2        {
 3
 4            List<String> results = new List<string>();
 5
 6            lock (m_groupPoolSync)
 7            {
 8                if (!m_groupPoolInitialized)
 9                {
10                    foreach (String result in GetAdGroupsFromAD())
11                    {
12                        m_groupPool.Add(result);
13                    }

14
15                    m_groupPoolInitialized = true;
16                }

17
18                results.AddRange(m_groupPool);
19            }

20
21            return results.ToArray();
22        }
 

有时必须把缓存池清空,这里使用一个统一的方法来做这个,这里方法里也对m_groupPoolSync进行了加锁,因为有可能同时有另外一个线程调用GetAdGroups()方法。

1        public static void ClearPools()
2        {
3            lock (m_groupPoolSync)
4            {
5                m_groupPoolInitialized = false;
6            }

7        }