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

Kri*_*son 1 c# task-parallel-library

我有以下课程:

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

然后我有我的Form1代码:

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

到目前为止,一切正常。但是我在窗体上添加了一个进度条,我想根据iie 的值对其进行更新。如果i=34那么34%完成。

我可以invoke将进度条属性从timeConsumingCode()更改为值,但我想使类与表单尽可能分开,以便将来可以将其移植到其他应用程序。

有没有一种方法可以更改进度MyClass栏的值而不必依赖于form1?

我希望我足够清楚

SWe*_*eko 5

.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);
    });
}
Run Code Online (Sandbox Code Playgroud)

加上电话

progress.Report(someNumber);
Run Code Online (Sandbox Code Playgroud)

在该MyClass.timeConsumingCode方法的适当位置。

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