.NET Framework
Использование прогресса и IProgress
Поиск…
Отчет о прогрессе
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>
и поэтому должен быть вызван в Progress<T>
когда он IProgress<T>
на IProgress<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