Ok, quindi in pratica ho un sacco di attività (10) e voglio iniziarle tutte nello stesso momento e attendere che vengano completate. Al termine, voglio eseguire altri compiti. Ho letto un po 'di risorse di questo, ma non riesco a farlo bene per il mio caso particolare ...Esecuzione di attività in parallelo
Ecco quello che ho attualmente (codice è stata semplificata):
public async Task RunTasks(){
var tasks = new List<Task>
{
new Task(async() => await DoWork()),
//and so on with the other 9 similar tasks
}
Parallel.ForEach(tasks, task =>
{
task.Start();
});
Task.WhenAll(tasks).ContinueWith(done=>{
//Run the other tasks
});
}
//This function perform some I/O operations
public async Task DoWork(){
var results = await GetDataFromDatabaseAsync();
foreach(var result in results){
await ReadFromNetwork(result.Url);
}
}
Quindi il mio problema è che quando aspetto che le attività vengano completate con la chiamata WhenAll
, mi dice che tutte le attività sono finite anche se nessuna di esse è stata completata. Ho provato ad aggiungere Console.WriteLine
nel mio foreach
e quando ho inserito l'attività di continuazione, i dati continuano ad arrivare dal mio precedente Task
s che non sono davvero finiti.
Cosa sto facendo di sbagliato qui?
ho il sospetto in tutto questo si dispone di una '' task da qualche parte (chiamando il costruttore attività è direttamente un po 'sospetto) e si vuole veramente ad attendere il compito interiore. Puoi usare 'Task.Run' al posto del costruttore di compiti/Start? 'Task.Run' farà lo scartare per te. –
Così si pensa che dovrei fare: compiti var = nuova lista { Task.Run (() => DoWork())} –