我已经尝试了一段时间来得到一些我认为可以简单使用.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
太早。
我想也许有一种方法可以通过调用一个 async
方法来得到一个不运行的 Task<T>
,这样我就可以在这两个任务上调用 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;
}