When i use invoke inside AddListBoxItem function as seen below software become unreponsive and frozen but if i use BeginInvoke it works. Why is that happening ?
visual studio 2010 , C# 4.0
private void button2_Click(object sender, EventArgs e)
{
var watch = Stopwatch.StartNew();
Parallel.For(2, 20, (i) =>
{
var result = SumRootN(i);
AddListBoxItem("root " + i + " : " + result);
});
AddListBoxItem(watch.ElapsedMilliseconds.ToString());
}
private delegate void AddListBoxItemDelegate(object item);
private void AddListBoxItem(object item)
{
if (this.listBox1.InvokeRequired)
{
this.listBox1.Invoke(new AddListBoxItemDelegate(this.AddListBoxItem), item);
}
else
{
this.listBox1.Items.Add(item);
}
}
Your UI thread will wait for
Parallel.Forto complete before it continues. That means it can’t process any further UI messages until it’s completed.Now when the worker threads call
Invoke, they wait until the UI thread processes the delegate before they continue. So they’re waiting for the UI thread to get free, basically.Hence, you have a deadlock – the UI thread is waiting for the tasks, which are waiting for the UI thread…
BeginInvokeworks because then the task threads don’t wait for the delegates to be processed in the UI thread.I would suggest that you don’t call
Parallel.Forin the UI thread to start with. You’ll block the UI until it completes anyway, which isn’t a good idea. Do the whole thing in a background thread – then you can still useInvokeif you want, and while it’s doing the computation the UI will still be responsive.