我将如何从背景工作者中填充列表框?

问题描述 投票:1回答:2

我在从后台工作人员线程填充列表框时遇到麻烦。我目前有以下代码:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        var lockedUsers = new List<UserPrincipal>();
        using (var context = new PrincipalContext(ContextType.Domain, "domain", smtu, smtp))
        {
            GroupPrincipal grp = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "Domain Users");
            foreach (var userPrincipal in grp.GetMembers(false))
            {

                var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userPrincipal.SamAccountName);
                if (user != null)
                {
                    if (user.IsAccountLockedOut())
                    {
                        listBox1.Items.Add(@"domain\ " + user);
                    }
                }
            }
        }
    }

这将返回异常,说我无法写入主UI,这是正确的。但是我一直无法找到解决方法。我尝试了以下操作,尽管它没有出现任何错误,但没有填充列表框。

    List<string> listusers = new List<string>();


    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        var lockedUsers = new List<UserPrincipal>();
        using (var context = new PrincipalContext(ContextType.Domain, "domain", smtu, smtp))
        {
            GroupPrincipal grp = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "Domain Users");
            foreach (var userPrincipal in grp.GetMembers(false))
            {

                var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userPrincipal.SamAccountName);
                if (user != null)
                {
                    if (user.IsAccountLockedOut())
                    {
                        listusers.Add(@"domain\" + user);
                    }
                }
            }
        }
    }

    private async void timerlocked_Tick(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
        listBox1.DataSource = listusers;
    }

有什么想法吗?

c# .net winforms listbox backgroundworker
2个回答
1
投票

传递给DoWorkEventArgs委托的DoWorkEventHandler具有Result property

获取或设置一个表示异步操作结果的值。

您设置的Result将通过传递给该委托的Result发送到RunWorkerCompleted事件。

因此,要解决此问题,您可以在RunWorkerCompletedEventArgs事件内部构建List<string>,将DoWork属性设置为该列表,处理Result事件并从RunWorkerCompleted访问该列表。] >

RunWorkerCompletedEventArgs.Result

0
投票

[要从后台工作程序访问UI线程,您可以在private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var result = new List<string>(); var lockedUsers = new List<UserPrincipal>(); using (var context = new PrincipalContext(ContextType.Domain, "domain", smtu, smtp)) { GroupPrincipal grp = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "Domain Users"); foreach (var userPrincipal in grp.GetMembers(false)) { var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userPrincipal.SamAccountName); if (user != null) { if (user.IsAccountLockedOut()) { result.Add(@"domain\ " + user); } } } } e.Result = result; } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { // Error handling. } if (e.Cancelled) { // If you support cancellation... } listBox1.Items.Clear(); listBox1.Items.AddRange((e.Result as List<string>).ToArray()); } RunWorkerCompleted事件中进行工作,或者-如果您想在工作程序运行时访问UI,请查看[C0 ]。

© www.soinside.com 2019 - 2024. All rights reserved.