Ho cercato per un po 'per ottenere qualcosa che ho pensato che sarebbe stato semplice lavorare con .NET 4.5eseguire due compiti asincroni in parallelo e raccogliere i risultati in .NET 4.5
voglio sparare due attività in esecuzione lunghi allo stesso tempo e raccogliere i
risultati in nel miglior C# 4.5 (RTM) modo
i seguenti lavori ma non mi piace perché:
- voglio
Sleep
essere un metodo asincrono così puòawait
oth er metodi - Sembra maldestro con
Task.Run()
- Non penso che questo stia usando addirittura nessuna nuova funzionalità linguistica!
codice di lavoro:
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Task.Run(() => Sleep(5000));
var task2 = Task.Run(() => Sleep(3000));
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}
private static int Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
Console.WriteLine("Sleeping for " + ms + " FINISHED");
return ms;
}
codice non lavoro:
Update: Questo funziona davvero ed è il modo corretto per farlo, l'unico problema è il Thread.Sleep
Questo codice non funziona perché il l a Sleep(5000)
avvia immediatamente l'attività in esecuzione, pertanto Sleep(1000)
non viene eseguito fino al completamento. Questo è vero anche se Sleep
è async
e non sto utilizzando await
o chiamando .Result
troppo presto.
ho pensato che forse c'è un modo per ottenere un non-esecuzione Task<T>
chiamando un metodo async
così ho potuto quindi chiamare Start()
sui due compiti, ma io non riesco a capire come ottenere un Task<T>
da chiamare un asincrona metodo.
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Sleep(5000); // blocks
var task2 = Sleep(1000);
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for " + totalSlept + " ms");
}
private static async Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
return ms;
}
nota: fare Andare un metodo asincrono fa differenza –
blocco che sta accadendo a ' task1.Result' non in 'var task1 = Sleep (5000)' perché il metodo di sospensione senza una parola chiave await è sincrono. – Arvis