【问题标题】:C#: RunWorkerAsync() doesn't trigger DoWork()C#:RunWorkerAsync() 不会触发 DoWork()
【发布时间】:2014-09-05 13:12:43
【问题描述】:

我正在编写一个基于表单的小型应用程序来连接到 LDAP 服务器,并且我希望“连接”按钮在后台工作。所以我一直在关注信息和讨论 here

但无论出于何种原因,我的代码似乎无法正常工作:我在 'worker.RunWorkerAsync();' 处设置了一个断点它只是一步一步地穿过它。

我做错了什么?我在 Visual Studio 2010 中工作,以防万一。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices;
using System.Threading;

namespace ldapconnect
{


public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {

    }

    public Form1()
    {
        InitializeComponent();
    }

    //server
    public string lds;
    //naming context
    public string root;

    public string username;
    public string password;

    BackgroundWorker worker = new BackgroundWorker();

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        worker = sender as BackgroundWorker;
        foreach (string s in connect(worker, e, lds + "/" + root, txt_user.Text.ToString(), txt_pass.Text.ToString()))
        {
            rtb_results.Text += s + "\r\n";
        }
    }

    private List<string> connect(BackgroundWorker worker, DoWorkEventArgs e, String serv, string usr, string pass)
    {
        //Directory search code taking server path and creds passed in from form
        DirectoryEntry conn = new DirectoryEntry(serv, usr, pass);
        DirectorySearcher ds = new DirectorySearcher(conn);

        //I only want users
        ds.Filter = "objectClass=user";

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

        try
        {
            SearchResultCollection results = ds.FindAll();

            foreach (SearchResult result in results)
            {
                sendBack.Add(result.ToString());                    
            }                
        }
        catch (Exception ex)
        {
            sendBack.Clear();
            sendBack.Add(ex.ToString());
        }

        return sendBack;
    }

    //connect button start background worker
    private void btn_connect_Click(object sender, EventArgs e)
    {
        worker.RunWorkerAsync();
    }

    //Exit Button
    private void btn_close_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    //set server path
    private void btn_server_Click(object sender, EventArgs e)
    {
        string serv = inputBox("ldap://", "IP or DNS Name of LDS Server", "");
        lds = serv;
        lbl_server.Text = lds;
    }

    //set default context
    private void btn_context_Click(object sender, EventArgs e)
    {
        string cntx = inputBox("In CN=,DC=,DC= Form:", "Default Naming Context", "");
        root = cntx;
        lbl_cntx.Text = root;
    }

    //VB interaction box
    private string inputBox(string a,string b,string c)
    {
        return Microsoft.VisualBasic.Interaction.InputBox(a, b, c);
    }

    private void btn_Defaults_Click(object sender, EventArgs e)
    {
        lds = "LDAP://127.0.0.1";
        root = "DC=USERS,DC=TEST,DC=LOCAL";
        txt_user.Text = "reader";
        txt_pass.Text = "password";
        lbl_server.Text = lds;
        lbl_cntx.Text = root;
    }
}
}

【问题讨论】:

  • 警告!在获取和设置 TextBox 值时,您正在从后台工作线程内部访问 UI 线程。
  • 另请注意,如果您使用的是 .NET 4,则可以省略 BackgroundWorker,而根据代码判断只需使用 Parallel.ForEach
  • 这条线有什么意义:worker = sender as BackgroundWorker;?
  • 克里斯,这是上次尝试留下的。感谢您为了这个问题指出它!

标签: c# .net visual-studio-2010


【解决方案1】:

你永远不会把事件联系起来。

   public Form1()
    {
        InitializeComponent();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    }

【讨论】:

  • 谢谢大家的信息。 Wonko the Sane 得到了它的工作。这就是我在论坛帖子中跳来跳去试图找出一个相对高级的概念所得到的……
  • 没问题。不要忘记您可以连接其他事件,包括“报告进度”(您可以使用它来更新 UI 线程上的几乎所有内容,而不仅仅是进度),以及工作人员何时完成。
【解决方案2】:

你还没有设置

worker.DoWork += new DoWorkEventHandler(worker_DoWork);

在致电worker.RunAsync()之前

【讨论】:

    【解决方案3】:

    RunWorkerAsync() 启动工作线程并立即返回,因此调试器似乎“单步执行”。在worker_DoWork() 方法中设置断点。

    【讨论】:

    • 你是对的,RunWorkerAsync 永远不会阻塞,即使它正在工作,但他的代码由于所有其他答案中提到的原因而无法工作。
    • 同意,活动必须先连接起来。
    【解决方案4】:

    如果您仍然有事件并且无法正常工作,请尝试以下操作

    打电话就行了

    System.Windows.Forms.Application.DoEvents();

    在调用 RunWorkerAsync() 之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      相关资源
      最近更新 更多