gpt4 book ai didi

c# - 将集合从 backgroundworker DoWork 传递给 backgroundworker Completed 并执行 foreach

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:53 26 4
gpt4 key购买 nike

我的目标是:

  • 用户在组合框中输入完整或部分计算机名
  • 按钮单击事件启动后台工作程序将计算机名传递给 DoWork 方法
  • DoWork 方法在 ActiveDirectory 中搜索计算机名并将集合传递给 WorkerCompleted 方法
  • WorkerCompleted 方法将每个计算机名称添加到组合框项目。

我的错误出在我的 backgroundWorker_RunWorkerCompleted 方法中的 foreach 循环中。

  • “foreach 语句不能对类型为‘object’的变量进行操作,因为‘object’不包含‘GetEnumerator’的公共(public)定义”

如果我执行 MessageBox.Show(results.First().ToString());在 DoWork 方法中,我可以查看集合中的第一个计算机名。

如果我执行 MessageBox.Show(e.Result.ToString());在 DoWork 和 WorkerCompleted 方法中,我得到了这个:

  • “System.DirectoryServices.AccountManagement.PrincipalSearchResult`1[System.DirectoryServices.AccountManagement.Principal]”

如有任何相关指导,我们将不胜感激!

    private void button1_Click(object sender, EventArgs e)
{
//Saves computername entered by user to pass into DoWork method
string PCName = comboBox1.Text;

//Start background thread passing computer to the Dowork method
backgroundWorker1.RunWorkerAsync(PCName);
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
//Setup Filter
ComputerPrincipal computer = new ComputerPrincipal(ctx);
computer.Name = "*" + e.Argument + "*";

//Search for PC
PrincipalSearcher ps = new PrincipalSearcher();
ps.QueryFilter = computer;

//Get Results
PrincipalSearchResult<Principal> results = ps.FindAll();

//results will be passed to RunWorkerCompleted
e.Result = results;
}
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Add each computername to combobox
foreach (object PC in e.Result) // <--------------- ERROR HERE!
{
comboBox1.Items.Add(PC.ToString());
}
}
}

最佳答案

你必须投 e.Result在来自 object 的已完成处理程序中至 PrincipalSearchResult<Principal>以便遍历它。

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Add each computername to combobox
PrincipalSearchResult<Principal> results = (PrincipalSearchResult<Principal>)e.Result;
foreach (Principal PC in results)
{
comboBox1.Items.Add(PC.ToString());
}
}

编辑:

PrincipalSearcher不能在 Background Worker 中使用,因为它使用需要单线程单元 (STA) 的 COM 组件。后台工作线程在多线程单元 (MTA) 中运行。 ApartmentState 可以使用 Thread.SetApartmentState 设置,但必须在线程启动前调用(因此不能用于改变BackgroundWorker工作线程的ApartmentState)。

关于c# - 将集合从 backgroundworker DoWork 传递给 backgroundworker Completed 并执行 foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18110738/

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