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

问题描述 投票:1回答:1

我有以下课程:

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%。

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

是否有一种方法可以更改进度条的值而不必使MyClass依赖于form1?

我希望我足够清楚

c# task-parallel-library
1个回答
5
投票

。net 4.5框架中的TPL具有一个实现为IProgress<T>IProgress<T>接口。在您的情况下,由于需要一个数字作为进度报告,因此可以使用Progress<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); }); } 方法的适当位置。

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

© www.soinside.com 2019 - 2024. All rights reserved.