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
Sleepessere un metodo asincrono in modo che possa utilizzareawaitaltri 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è asynce non sto usando awaito chiamando .Resulttroppo presto.
Ho pensato che forse ci fosse un modo per ottenere un non in esecuzione Task<T>chiamando un asyncmetodo 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.Resultnon alle var task1 = Sleep(5000)perché il tuo metodo Sleep senza una parola chiave await è sincrono.