Ho provato per un po 'di tempo a ottenere qualcosa che pensavo sarebbe stato semplice lavorare con .NET 4.5
Voglio lanciare due attività a lunga esecuzione contemporaneamente e raccogliere i
risultati nel miglior modo C # 4.5 (RTM)
Il seguente funziona ma non mi piace perché:
- Voglio
Sleep
essere un metodo asincrono in modo che possa utilizzareawait
altri metodi - Sembra solo goffo con
Task.Run()
- Non penso che questo stia nemmeno usando alcuna nuova funzionalità del linguaggio!
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 funzionante:
Aggiornamento: funziona davvero ed è il modo corretto per farlo, l'unico problema è il file Thread.Sleep
Questo codice non funziona perché la chiamata a Sleep(5000)
avvia immediatamente l'esecuzione dell'attività, quindi Sleep(1000)
non viene eseguita fino al completamento. Questo è vero anche se lo Sleep
è async
e non sto usando await
o chiamando .Result
troppo presto.
Ho pensato che forse ci fosse un modo per ottenere un non in esecuzione Task<T>
chiamando un async
metodo in modo da poter quindi chiamare Start()
le due attività, ma non riesco a capire come ottenerlo Task<T>
chiamando un metodo asincrono.
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;
}
task1.Result
non alle var task1 = Sleep(5000)
perché il tuo metodo Sleep senza una parola chiave await è sincrono.