我已经尝试了一段时间,以获取一些我认为使用.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
不是at,var task1 = Sleep(5000)
因为没有await关键字的Sleep方法是同步的。