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ただし、フォームにプログレスバーを追加したので、 ieの値に基づいて更新したいと考えています。もしそうならi=34、34% 完了。

invokeプログレスバーのプロパティで値を変更することはできtimeConsumingCode()ますが、将来的に他のアプリに移植できるように、クラスをフォームからできるだけ分離したいと考えています。

MyClassform1 に依存することなくプログレスバーの値を変更する方法はありますか?

私は十分に明確だったと思います

4

1 に答える 1

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);
    });
}

呼び出しと相まって

progress.Report(someNumber);

メソッドの適切な場所でMyClass.timeConsumingCode

もちろん、イベント ハンドラー (ここではコンストラクター引数として指定) は非同期で呼び出されます。

于 2013-06-06T14:30:51.037 に答える