我在从backgroundworker线程填充列表框时遇到麻烦。我目前有以下代码:
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;
}
有任何想法吗?
该DoWorkEventArgs
获取传递给DoWorkEventHandler
委托具有Result
物业
获取或设置一个表示异步操作结果的值。
在Result
你设定将沿着该发送RunWorkerCompleted
事件经过RunWorkerCompletedEventArgs
是获取传递给该委托。
因此,要解决此问题,您可以List<string>
在DoWork
事件内部构建,将Result
属性设置为该列表,处理该RunWorkerCompleted
事件并从中访问该列表RunWorkerCompletedEventArgs.Result
。
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());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句