Некоторое время я пытался получить то, что, как мне казалось, было бы просто работать с .NET 4.5.
Я хочу запустить две длительные задачи одновременно и собрать
результаты лучшим способом C # 4.5 (RTM)
Следующее работает, но мне это не нравится, потому что:
- Я хочу
Sleep
быть асинхронным методом, чтобыawait
другие методы - Это выглядит неуклюже с
Task.Run()
- Я не думаю, что здесь вообще используются какие-либо новые языковые функции!
Рабочий код:
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;
}
Нерабочий код:
Обновление: это действительно работает, и это правильный способ сделать это, единственная проблема - это Thread.Sleep
Этот код не работает, потому что вызов Sleep(5000)
немедленно запускает задачу, поэтому Sleep(1000)
не запускается, пока она не будет завершена. Это верно , даже если Sleep
это async
и я не использую await
или позвонив по телефону .Result
слишком рано.
Я подумал, может быть, есть способ отключить запуск Task<T>
, вызвав async
метод, чтобы я мог затем вызватьStart()
две задачи, но я не могу понять, как получить Task<T>
от вызова асинхронного метода.
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
not at, var task1 = Sleep(5000)
потому что ваш метод Sleep без ключевого слова await является синхронным.