【问题标题】:Run a method and update progressbar using tpl使用 tpl 运行方法并更新进度条
【发布时间】:2013-06-06 14:16:21
【问题描述】:

我有以下课程:

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】:

.net 4.5 框架中的 TPL 有一个IProgress&lt;T&gt; 接口,它被实现为Progress&lt;T&gt;。在您的情况下,由于您需要一个数字作为进度报告,您可以使用 Progress&lt;int&gt; 实例并将事件处理程序附加到其 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 方法中的适当位置。

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

【讨论】:

  • 有一篇关于任务异步模式here 的好文档详细介绍了这一点。
  • @SWeko 这绝对是我想要的方向!但是我很困惑我将如何编写 ...ui 处理代码...换句话说,我将如何设置进度条的最大值和新值?
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多