Я деякий час намагався отримати щось, на що думав, що це буде просто працювати з .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
не в var task1 = Sleep(5000)
тому випадку, оскільки метод сну без ключового слова, що очікує, є синхронним.