【发布时间】:2019-10-29 14:01:50
【问题描述】:
我在从后台工作线程填充列表框时遇到问题。我目前有以下代码:
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;
}
有什么想法吗?
【问题讨论】:
-
使用 BackgroundWorker 的 Completed 事件来设置该 listusers 集合的 DataSource 属性,而不是计时器的 Tick 事件。
标签: c# .net winforms listbox backgroundworker