Here is the code (in a simple form):
delegate DataTable Functie();
Functie deleg;
DataTable find1()
{
return new DataTable();
}
DataTable find2()
{
return new DataTable();
}
private void btnFind1_Click(object sender, EventArgs e)
{
deleg = this.find2;
backgroundWorker1.RunWorkerAsync();
}
private void btnFind2_Click(object sender, EventArgs e)
{
deleg = this.find1;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bk = sender as BackgroundWorker;
e.Result = deleg;
if (bk.CancellationPending)
{
e.Cancel = true;
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Operation was canceled");
}
else if (e.Error != null)
{
MessageBox.Show("An error occurred: " + e.Error.Message);
}
else
{
dataGridView1.DataSource = (DataTable)e.Result;
}
}
So, basically I have 2 functions find1 and find2 and these are long-time-processing functions. I want to run these 2 functions on an BackgroundThread so I created a delegate. When i call one function, the delegate takes the address of a function or the other.
When I start the thread, I pass the delegate instead of directly typing the function, so I won’t create 2 background threads, each with its own events and stuff.
But I run into problems, when I run the program, the following error is thrown:
"System.Reflection.TargetInvocationException was unhandled
Exception has been thrown by the target of an invocation."
It has to do with the delegate passed to the thread. I can, of course, write everything simpler with conditions to see what functions has to be ran, but I got into this and I didn’t know how to solve it. I want to know what I did wrong.
I think, in your DoWork function, you need to call the delegate like this:
The reason is that this will actually invoke the function, rather than just set the result equal to a reference to the function.