运行方法并使用tpl更新进度条

时间:2013-06-06 14:16:22

标签: c# task-parallel-library

我有以下课程:

class MyClass
{
    public void timeConsumingCode(){
        for(int i=0; i<100; i++)
        {
            Threading.Thread.Sleep(1000);
        }
    }
}

然后我有我的Form1代码:

private void btn_RunTimeConsumingCode_Click(object sender, EventArgs e)
{
    Task loadMasterFile = Task.Factory.StartNew(() => 
    { 
        MyClass myclass = new MyClass();
        myClass.timeConsumingCode();
    });
}

到现在为止一切正常。但是我在表单上添加了一个进度条,我想根据i的值来更新它。如果i=34则完成了34%。

我可以invoke来自timeConsumingCode()的进度条属性来更改值,但我想让类尽可能与表单保持分离,以便将来可以将其移植到其他应用

有没有办法让我可以更改进度条的值,而不必让MyClass依赖于form1?

我希望我足够清楚

1 个答案:

答案 0 :(得分:3)

.net 4.5框架中的TPL有一个IProgress<T>接口,实现为Progress<T>。在您的情况下,因为您需要一个数字作为进度报告,您可以使用Progress<int>实例并将事件处理程序附加到其ProgressChanged事件,并按以下方式:

private void btn_RunTimeConsumingCode_Click(object sender, EventArgs e)
{
    Progress<int> progress = new Progress(p => {...ui handling code ...});

    Task loadMasterFile = Task.Factory.StartNew(() => 
    { 
      MyClass myclass = new MyClass();
      myClass.timeConsumingCode(progress);
    });
}

再加上通话

progress.Report(someNumber);

MyClass.timeConsumingCode方法的适当位置。

当然,事件处理程序(此处指定为构造函数参数)是异步调用的。