サーチ…


シンプルプログレスレポート

IProgress<T>は、あるプロシージャの進行状況を別のプロシージャに報告するために使用できます。この例は、進行状況を報告する基本的なメソッドを作成する方法を示しています。

void Main()
{
    IProgress<int> p = new Progress<int>(progress =>
    {
        Console.WriteLine("Running Step: {0}", progress);
    });
    LongJob(p);
}

public void LongJob(IProgress<int> progress)
{
    var max = 10;
    for (int i = 0; i < max; i++)
    {
        progress.Report(i);
    }
}

出力:

Running Step: 0
Running Step: 3
Running Step: 4
Running Step: 5
Running Step: 6
Running Step: 7
Running Step: 8
Running Step: 9
Running Step: 2
Running Step: 1

このコードを実行すると、数字が順不同で出力されることがあります。これは、 IProgress<T>.Report()メソッドが非同期に実行されるため、進行状況を順番に報告する必要がある状況に適していないためです。

IProgressの使用

System.Progress<T>クラスでは、 Report()メソッドを使用できないことに注意してください。このメソッドはIProgress<T>インターフェイスから明示的に実装されているため、 IProgress<T>キャストされるときにProgress<T>で呼び出される必要があります。

var p1 = new Progress<int>();
p1.Report(1); //compiler error, Progress does not contain method 'Report'

IProgress<int> p2 = new Progress<int>();
p2.Report(2); //works

var p3 = new Progress<int>();
((IProgress<int>)p3).Report(3); //works


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow