I have a WinForms application that calls a business class method that does some heavy work, taking about 5 seconds for each call. The main form calls this method in a loop. This cycle can work from 10 times to, possibly, up to 10 thousand times.
The WinForms application sends the parameter to the business class and has an area that displays the time required for each method call and the value returned by this method. How can I tell my main window and update the text area in the main winform using the method that was returned for each call?
Currently, data is received immediately after the completion of all streams. Is there a way to update the interface for all iterations of the loop after each call? I do not mind if this is done consistently as well.
THE FORM
HeavyDutyClass hd; public Form1() { InitializeComponent(); hd = new HeavyDutyClass(); } //BUTTON CLICK private void Start_Click(object sender, EventArgs e) { int filecount = 5000; //BAD - opening 5000 threads! Any other approach? hd.FileProcessed += new EventHandler(hd_FileProcessed); var threads = new Thread[filecount]; for (int i = 0; i < filecount; i++) { threads[i] = new Thread(() => { hd.LongRunningMethod(); }); threads[i].Start(); } } //BUSINESS CLASS EVENT THAT FIRES WHEN BUSINESS METHOD COMPELTES void hd_FileProcessed(object sender, EventArgs e) { if (dgv.InvokeRequired) { dgv.Invoke((MethodInvoker)delegate { UpdateGrid(); }); } } private void UpdateGrid() { dgv.Rows.Add(1); int i = dgv.Rows.Count; dgv.Rows [ i-1].Selected = true; dgv.FirstDisplayedScrollingRowIndex = i - 1; }
Business Heavy Duty class
public event EventHandler FileProcessed; public HeavyDutyClass() { } protected virtual void OnMyEvent(EventArgs e) { if (FileProcessed != null) { FileProcessed(this, e); } } public bool LongRunningMethod() { for (double i = 0; i < 199990000; i++) {
source share