VS2012 和 Async 目标包是最佳选择,原因如下:
- 语法与 C#5 中的相同,使升级到 C#5 更容易。Async CTP 有足够的差异(TaskEx 代替 Task 类,TaskAsync 代替 Task 后缀,令牌参数等),这使得升级很麻烦。不难,就是麻烦
- 等待/异步行为更好,更接近 C#5。在 Async CTP 中,循环内部发生的异常将导致整个循环静默失败。有关受此影响的方案,请参阅重试任务。
- 没有安装问题。Async CTP 和 VS 2010 SP1 必须按特定顺序安装以避免出现问题。
- 您可以期望 MS 对目标包提供某种支持,而您可以期望 Async 包没有。
一个小警告是,在具有 VS2010 + Async CTP 的机器上安装 VS2012 会破坏 Async CTP。您将无法再使用 VS2010 版本来编译 Async 代码。
作为异步行为很重要的示例,请考虑以下重试任务的非常简单的方法。当函数使用 Async CTP 编译时,如果发生异常,它会静默失败(如应用程序静默终止):
private static async Task<T> Retry<T>(Func<T> func, int retryCount)
{
while (true)
{
try
{
var result = await Task.Run(func);
return result;
}
catch
{
if (retryCount == 0)
throw;
retryCount--;
}
}
}
也就是说,我已经使用 Async CTP 一年多了,唯一的问题是添加 Visual Studio 2010 SP1 后的安装顺序。如果您弄错了顺序,Asycn CTP 将无法安装,您必须删除 SP1 并以正确的顺序重新安装所有内容。
不过,我会尽快转移到 2012 年和目标包(即整个团队都准备好切换),以避免多个代码版本和烦人的异常行为。