在Winform C#中创建方法报告进度

时间:2016-11-28 16:56:20

标签: c# .net winforms

我有两个类,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
}

我知道如果方法在表单元素中,如何报告进度,但是如果我调用外部方法,我将如何报告进度?它甚至可能吗?

由于

1 个答案:

答案 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可能会更新显示当前行和当前列的一对标签。