我已经尝试了一段时间,试图用.NET 4.5来完成一些我认为很简单的工作。
我想同时启动两个长时间运行的任务,并以最佳的C# 4.5(RTM)方式收集结果。
以下代码可以工作,但我不喜欢它,因为:
- 我希望
我想同时启动两个长时间运行的任务,并以最佳的C# 4.5(RTM)方式收集结果。
以下代码可以工作,但我不喜欢它,因为:
- 我希望
Sleep
成为一个异步方法,这样它可以等待其他方法。
- 使用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;
}
task1.Result
而不是var task1 = Sleep(5000)
,因为你的Sleep
方法没有使用 await 关键字,所以它是同步的。 - Arvisprivate static async Task<int> Sleep(int ms)
方法应该给你一个编译警告(CS1998),但你没有注意到。 - undefined