我有一个WinForms应用程序,它调用一个业务类方法执行某些耗时的操作,每次调用需要约5秒钟。主窗体在循环中调用此方法。该循环可以运行10次到10000次不等。
WinForms应用程序向业务类发送参数,并有一个区域显示每个方法调用所花费的时间以及方法返回的值。如何通知主窗口并更新主Winform中的文本区域,以显示每个调用所返回的内容?
目前所有数据都在所有线程完成后一次性传输。是否有一种方法可以在每个调用完成后更新循环的所有迭代的UI?我也不介意按顺序进行更新。
窗体:
业务 HeavyDuty 级别
WinForms应用程序向业务类发送参数,并有一个区域显示每个方法调用所花费的时间以及方法返回的值。如何通知主窗口并更新主Winform中的文本区域,以显示每个调用所返回的内容?
目前所有数据都在所有线程完成后一次性传输。是否有一种方法可以在每个调用完成后更新循环的所有迭代的UI?我也不介意按顺序进行更新。
窗体:
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;
}
业务 HeavyDuty 级别
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++)
{
//time consuming loop
}
OnMyEvent(EventArgs.Empty);
return true;
}
ReportProgress方法
)来实现你想做的事情呢?Background Worker就是为这种单个长时间运行的后台任务而设计的。你可以搜索并找到很多相关示例。 - Angshuman Agarwal