gpt4 book ai didi

c# - 更好的技术 : Reading Data in a Thread

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:58 25 4
gpt4 key购买 nike

我有一个名为 GetEmployeeList 的例程,它会在我的 Windows 应用程序启动时加载。

此例程从我们的 Active Directory 服务器中提取基本员工信息,并将其保留在名为 m_adEmpList 的列表中。

我们将一些 Windows 帐户设置为公共(public)配置文件,我们制造车间的大多数员工都在使用这些帐户。此 m_adEmpList 使我们的员工能够使用那些公共(public)配置文件登录以选择功能。

加载所有 Active Directory 数据后,如果该员工已登录,我将尝试根据 System.Environment.UserName“自动登录”该员工在他们的私有(private)资料下。 (顺便说一句,员工喜欢这个)

如果我不线程化 GetEmployeeList,Windows 窗体将显示为无响应,直到例程完成。

GetEmployeeList 的问题是,我们曾遇到过 Active Directory 服务器宕机、网络宕机或特定计算机无法连接到我们的网络。

为了解决这些问题,我提供了一个 ManualResetEvent m_mreTHREADSEARCH_TIMELIMIT 超时,这样进程就不会永远停止。在我获得员工列表之前,我无法使用带有 System.Environment.UserNamePrivate Profile 登录某人。

我知道我没有展示所有代码,但希望没有必要。

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;
}

我只想放一个基本的 lock使用像 m_adEmpList 这样的东西,但我不确定锁定我需要填充的东西是否是个好主意,实际数据填充将在另一个线程中使用例程 填充线程

如果ManualResetEventWaitOne计时器未能在分配的时间内收集我需要的数据,可能是网络问题,并且 m_mre 没有很多记录(如果有的话)。因此,下次我需要再次尝试提取此信息。

如果有人理解我要解释的内容,我希望看到更好的方法。

只是现在看起来太勉强了。我一直认为有更好的方法来做到这一点。

最佳答案

我认为您以错误的方式处理多线程部分。我真的无法解释,但线程应该合作而不是争夺资源,但这正是你在这里有点困扰的地方。另一个问题是你的超时时间太长(这样会惹恼用户),同时又太短(如果 AD 服务器有点慢,但仍然存在并提供服务)。您的目标应该是让线程在后台运行,并在完成后更新列表。同时,您向用户提供一些后备方案,并通知用户列表仍在填充中。

关于您上面的代码的一些注意事项:

  • 您有一个仅在本地使用的变量 m_thread。此外,您的代码包含冗余检查该变量是否为空。
  • 如果您首先使用默认值/回退创建用户列表,然后通过函数更新它(确保您正在检查显示控件的 InvokeRequired 标志!),则不需要锁定。这意味着线程不访问存储为成员的列表,而是访问它具有独占访问权限的单独列表(不是成员变量)。然后更新函数替换(!)这个列表,所以现在它由 UI 独占使用。
  • 最后,如果 AD 服务器确实不存在,请尝试以某种方式将错误从后台线程转发到 UI,以便用户知道哪里出了问题。
  • 如果需要,您可以添加一个事件来通知线程停止,但在大多数情况下甚至没有必要。

关于c# - 更好的技术 : Reading Data in a Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18706570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com