Я пытался какое-то время получить что-то, что, как я думал, будет просто работать с .NET 4.5
Я хочу запустить две длительные задачи одновременно и собрать приводит к лучшему пути С# 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>
от вызова метода async.
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;
}