我有一个GetEmployeeList
在我的 Windows 应用程序启动时加载的例程。
该例程从我们的Active Directory服务器中提取基本员工信息,并将其保留在名为m_adEmpList
.
我们有几个 Windows 帐户设置为公共配置文件,我们生产车间的大多数员工都使用这些帐户。这使我们的员工能够使用这些公共配置文件m_adEmpList
登录以选择功能。
加载所有Active Directory数据后,我会尝试根据该员工System.Environment.UserName
是否在其私人配置文件下登录来“自动登录”该员工。(顺便说一句,员工喜欢这个)
如果我不使用线程GetEmployeeList
,Windows 窗体将显示为无响应,直到例程完成。
问题GetEmployeeList
在于,我们有时会遇到Active Directory服务器关闭、网络关闭或特定计算机无法通过我们的网络连接的情况。
为了解决这些问题,我在超时中包含了一个ManualResetEvent m_mre
,THREADSEARCH_TIMELIMIT
这样该过程就不会永远停止。在我拥有员工名单之前,我无法使用他们的私人档案登录某人。System.Environment.UserName
我意识到我没有显示所有代码,但希望没有必要。
public static ADUserList GetEmployeeList()
{
if ((m_adEmpList == null) ||
(((m_adEmpList.Count < 10) || !m_gotData) &&
((m_thread == null) || !m_thread.IsAlive))
)
{
m_adEmpList = new ADUserList();
m_thread = new Thread(new ThreadStart(fillThread));
m_mre = new ManualResetEvent(false);
m_thread.IsBackground = true;
m_thread.Name = FILLTHREADNAME;
try {
m_thread.Start();
m_gotData = m_mre.WaitOne(THREADSEARCH_TIMELIMIT * 1000);
} catch (Exception err) {
Global.LogError(_CODEFILE + "GetEmployeeList", err);
} finally {
if ((m_thread != null) && (m_thread.IsAlive)) {
// m_thread.Abort();
m_thread = null;
}
}
}
return m_adEmpList;
}
我想使用类似的东西来放置一个基本的锁m_adEmpList
,但我不确定锁定我需要填充的东西是否是个好主意,并且实际的数据填充将使用例程在另一个线程中发生fillThread
。
如果ManualResetEvent的WaitOne计时器未能在分配的时间内收集到我需要的数据,则可能是网络问题,并且m_mre
没有很多记录(如果有的话)。因此,我下次需要尝试再次提取此信息。
如果有人理解我要解释的内容,我希望看到一种更好的方法。
只是现在看来太勉强了。我一直在想有更好的方法来做到这一点。