2

我在我的机器上安装 VS-SP1 和 Async CTP V3 时遇到问题。由于某种原因,它会导致我在该机器上运行的任何 .NET 应用程序崩溃。(幸好我正在使用虚拟机,我可以回滚)。

我已将更新 csc.exe 文件复制到我的 Windows 目录中的 .NET Framework 4 目录中。

当我从命令行使用 msbuild 构建我的项目时,一切都构建并运行良好。

当我在 VS2010 中编译同一个项目时,我得到 async 关键字未知的编译时错误。

我不在乎 VS 没有突出显示 async 和 await 的语法,但它确实让我感到困扰,我必须从命令行构建项目。

  1. 为什么命令行 csc 可以工作,但在使用 VS 时却不行?

  2. 如何更改 VS 以正确编译异步代码(无需安装 Async CTP 本身)?

谢谢,

我愿意。

4

1 回答 1

3

VS2012 和 Async 目标包是最佳选择,原因如下:

  1. 语法与 C#5 中的相同,使升级到 C#5 更容易。Async CTP 有足够的差异(TaskEx 代替 Task 类,TaskAsync 代替 Task 后缀,令牌参数等),这使得升级很麻烦。不难,就是麻烦
  2. 等待/异步行为更好,更接近 C#5。在 Async CTP 中,循环内部发生的异常将导致整个循环静默失败。有关受此影响的方案,请参阅重试任务。
  3. 没有安装问题。Async CTP 和 VS 2010 SP1 必须按特定顺序安装以避免出现问题。
  4. 您可以期望 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 年和目标包(即整个团队都准备好切换),以避免多个代码版本和烦人的异常行为。

于 2012-06-25T07:28:55.597 回答