我有两个类,form1.cs和test.cs
Form1.cs在test.cs中调用一些公共方法。有可能以某种方式使程序报告进度吗?
例如,
在Form1.cs
中test.CallTestMethod();
在test.cs中
public void CallTestMethod()
{
// Read excel file line by line (~5000 lines)
// I used double for loops to iterate row and col
}
我知道如果方法在表单元素中,如何报告进度,但是如果我调用外部方法,我将如何报告进度?它甚至可能吗?
由于
答案 0 :(得分:4)
您需要CallTestMethod()
在非UI线程中执行。给它一个参数Action<double> reportProgressPercent
。请酌情致电reportProgressPercent
。当Form1
调用CallTestMethod()
时,让它传入适当的lambda,该lambda调用UI线程来报告进度。
public void CallTestMethod(Action<double> reportProgressPcnt)
{
foreach (var blah in whatever)
{
foreach (var foo in innerLoopWhatever)
{
// do stuff. On every nth iteration or whatever, figure out what
// your completed percentage is and pass it to reportProgressPcnt
double progress = (curRow / totalRows) * 100;
reportProgressPcnt(progress);
}
}
}
Form1.cs的
progBar1.Maximum = 100;
progBar1.Step = 1;
Task.Run(() => {
test.CallTestMethod(pcnt => {
Invoke(new Action(() => progBar1.Value = (int)pcnt));
})
});
如果您想以其他方式报告进度,请将参数更改为Action
;例如:
public void CallTestMethod(Action<int, int> reportCurrentRowAndColumn)
{
int curRow = 0;
int curCol = 0;
//...blah blah loop stuff, update values of curRow & curCol as needed...
reportCurrentRowAndColumn(curRow, curCol);
然后,您的Action
可能会更新显示当前行和当前列的一对标签。