Attualmente sto provando a stampare continuamente punti alla fine di una riga come una forma di progresso indeterminato, mentre un ampio elenco di attività è in esecuzione, con questo codice:Visualizzazione dell'avanzamento durante l'attesa di tutte le attività nell'elenco <Task> per il completamento
start = DateTime.Now;
Console.Write("*Processing variables");
Task entireTask = Task.WhenAll(tasks);
Task progress = new Task(() => { while (!entireTask.IsCompleted) { Console.Write("."); System.Threading.Thread.Sleep(1000); } });
progress.Start();
entireTask.Wait();
timeDiff = DateTime.Now - start;
Console.WriteLine("\n*Operation completed in {0} seconds.", timeDiff.TotalSeconds);
Dove tasks
da List<Task> tasks = new List<Task>();
,
e tasks.Add(Task.Run(() => someMethodAsync()));
è verificato 10000 s di volte.
Questo codice funziona attualmente, tuttavia, è questo il modo corretto di farlo, ed è questo il modo più economico?
Questa riga "var whenAllTask = Task.WhenAll (tasks);" essere bloccato fino al completamento di tutte le attività? e il codice attenderà sempre che tutte le attività vengano completate e successivamente eseguirà Task.Delay? –
Task.WhenAll (...) non blocca ma restituisce un'attività che termina quando tutte le attività nei parametri sono state completate. Lo stesso per Task.Delay. Restituisce un'attività che termina dopo 250 ms (nel codice di esempio). Il trucco consiste nell'attesa di una terza attività che si completa quando si completa l'attività Task.WhenAll OR Task.Delay. Aggiungerò alcuni commenti al codice. –
Grazie mille per la tua risposta dettagliata! Ho due domande sulla sintassi. Che cosa sta succedendo alla sintassi per la sottolineatura che hai usato nei parametri per 'var whenAll', e cosa sta succedendo nella sintassi di' for (;;) '? – cloudcrypt