【发布时间】:2012-09-02 19:28:41
【问题描述】:
我一直在尝试获得一些我认为使用 .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;
}
【问题讨论】:
-
注意:让 Go 成为异步方法没有区别
-
阻塞发生在
task1.Result而不是var task1 = Sleep(5000),因为没有 await 关键字的 Sleep 方法是同步的。
标签: c# asynchronous task-parallel-library .net-4.5