Hi
I have been struggling to get a toolbar to update its progress information from an event raised ina parallel for loop. I have tried using delegates to get it to work but it just hangs after about the iteration.
The code that replicates the problem is below. It s just a windows form with a toolstrip and a toolstripprogre ssbar with a button to start the test.
I am relativly new to multi threading but in all the examples i have tried from various sources on the net I cannot get this to work.
Best Regards
I have been struggling to get a toolbar to update its progress information from an event raised ina parallel for loop. I have tried using delegates to get it to work but it just hangs after about the iteration.
The code that replicates the problem is below. It s just a windows form with a toolstrip and a toolstripprogre ssbar with a button to start the test.
I am relativly new to multi threading but in all the examples i have tried from various sources on the net I cannot get this to work.
Code:
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.Threading; namespace WindowsFormsApplication1 { public partial class Form1 : Form { delegate void ProgressDelegate(int progress); public Form1() { InitializeComponent(); // A nasty HACK but the delegate method invocation seems to be recursive and not work. //Control.CheckForIllegalCrossThreadCalls = false; } private void button1_Click(object sender, EventArgs e) { Class1 test = new Class1(); test.progress += new EventHandler<ProgressArgs>(test_progress); test.DoWork(); this.toolStripProgressBar1.Value = 0; // reset } void test_progress(object sender, ProgressArgs e) { //if (e.ProgressValue>this.toolStripProgressBar1.Value) // this.toolStripProgressBar1.Value = e.ProgressValue; SetProgress(e.ProgressValue); } public void SetProgress(int progress) { if (this.InvokeRequired) { ProgressDelegate d = new ProgressDelegate(SetProgress); this.Invoke(d, new object[] { progress }); } else { this.toolStripProgressBar1.Value = progress; } } } class Class1 { public event EventHandler<ProgressArgs> progress; public void DoWork() { Parallel.For(0, 100, i => { Thread.Sleep(25); this.progress(this, new ProgressArgs(i)); }); } } class ProgressArgs : EventArgs { int _progressvalue = 0; public ProgressArgs(int progressvalue) { _progressvalue = progressvalue; } public int ProgressValue { get { return _progressvalue; } set { _progressvalue = value; } } } }
Comment