Search code examples
c#backgroundworker

Compile Error With BackgroundWorker


I am wanting to pass an additional parameter to my DoWork method, but am getting a compile error of No overload for 'backgroundWorker1_DoWork' matches delegate 'System.ComponentModel.DoWorkEventHandler'

This is my syntax, what should I do to fix this?

namespace Testing
{
public partial class Form1 : Form1
{
    public static string[] employeeName;

    public Form1()
    {
        InitializeComponent();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1WorkerSupportsCancellation = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }
    private void btn1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync(employeeName);
    }
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e, string[] employeeName)
    {
        //Just for example sake
        for (int q = employeeName.GetLowerBound(0); q <= employeeName.GetUpperBound(0); q++)
        {
          MessageBox.Show(employeeName[q];
        }
    }
}
}

Solution

  • DoWorkEventHandler has the following definition :

    public delegate void DoWorkEventHandler(
        Object sender,
        DoWorkEventArgs e
    )
    

    You cannot add a third argument. The object you want to get is in DoWorkEventArgs.Argument property.

    public partial class Form1 : Form1
    {
        public static string[] employeeName;
    
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1WorkerSupportsCancellation = true;
            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        }
        private void btn1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(employeeName);
        }
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string[] employeeName = (string[])e.Argument;
            //Just for example sake
            for (int q = employeeName.GetLowerBound(0); q <= employeeName.GetUpperBound(0); q++)
            {
              MessageBox.Show(employeeName[q];
            }
        }
    }