C#: RunWorkerAsync() doesn't trigger DoWork()

14,340

Solution 1

You are never wiring up the event.

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

Solution 2

You have not set

worker.DoWork += new DoWorkEventHandler(worker_DoWork);

before calling worker.RunAsync()

Solution 3

RunWorkerAsync() starts the worker thread and immediately returns thus the debugger seems to "step through it". Set a breakpoint in the worker_DoWork() method.

Solution 4

If u still have event and is not working, try the following

Just call

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

before calling RunWorkerAsync()

Share:
14,340
jagallout
Author by

jagallout

Updated on June 28, 2022

Comments

  • jagallout
    jagallout almost 2 years

    I am writing a small forms based application to connect to an LDAP server, and I wanted the "connect" button to work in the background. So I was following the information and discussion here

    but for whatever reason my code doesn't appear to be working right: I set a breakpoint at 'worker.RunWorkerAsync();' And it just steps right through it.

    What am I doing wrong? I am working in Visual Studio 2010, in case it matters.

    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;
        }
    }
    }
    
  • Servy
    Servy about 11 years
    You are correct that RunWorkerAsync won't ever block, even when it's working, but his code won't work for the reason mentioned in all of the other answers.
  • roryWoods
    roryWoods about 11 years
    Agreed, the event must be wired up first.
  • jagallout
    jagallout about 11 years
    Thank you all for the info. And Wonko the Sane got it working. Thats what I get for jumping around forum posts trying to figure out a relatively high level concept...
  • Wonko the Sane
    Wonko the Sane about 11 years
    No problem. Don't forget that there are additional events you can wire up, including for "reporting progress" (which you can use for updating almost anything on the UI thread, not just progress), and for when the worker is complete.