.NET Framework
Usando il progresso e IProgress
Ricerca…
Semplice resoconto dei progressi
IProgress<T>
può essere utilizzato per segnalare lo stato di avanzamento di alcune procedure a un'altra procedura. Questo esempio mostra come è possibile creare un metodo di base che ne segnali i progressi.
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);
}
}
Produzione:
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
Si noti che quando si esegue questo codice, è possibile che i numeri vengano riprodotti fuori ordine. Questo perché il IProgress<T>.Report()
viene eseguito in modo asincrono e pertanto non è adatto per le situazioni in cui è necessario riportare l'avanzamento in ordine.
Utilizzando IProgress
È importante notare che la System.Progress<T>
non ha il metodo Report()
disponibile su di esso. Questo metodo è stato implementato esplicitamente IProgress<T>
e, pertanto, deve essere richiamato su Progress<T>
quando viene IProgress<T>
il cast su un 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