我有以下课程:
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?
我希望我足够清楚
。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);
});
}
方法的适当位置。
当然,事件处理程序(在此指定为构造函数参数)被异步调用。