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

本文关键字:tpl 更新 方法 一个 运行 | 更新日期: 2023-09-27 18:17:26

我有以下类:

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 ie的值更新它。如果i=34,那么34%完成。

我可以invoke的进度条属性从timeConsumingCode()改变值,但我想保持类尽可能从形式分开,以便在将来它可以移植到其他应用程序。

是否有一种方法,我可以改变我的进度条的值,而不必使MyClass依赖于表单1?

我希望我说得够清楚了

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

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

private void btn_RunTimeConsumingCode_Click(object sender, EventArgs e)
{
    IProgress<int> progress = new Progress<int>(p => {...ui handling code ...});
    Task loadMasterFile = Task.Factory.StartNew(() => 
    { 
      MyClass myclass = new MyClass();
      myClass.timeConsumingCode(progress);
    });
}

与调用

耦合
progress.Report(someNumber);

MyClass.timeConsumingCode方法的适当位置。

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