使用Async V3而不安装它

时间:2012-06-24 11:18:23

标签: .net visual-studio-2010 visual-studio async-ctp async-await

我在我的机器上安装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本身)?

  3. 谢谢,

    伊多。

1 个答案:

答案 0 :(得分:3)

VS2012和异步定位包是最佳选择,原因如下:

  1. 语法与C#5中的相同,使得升级到C#5更容易。 Async CTP有足够的差异(TaskEx而不是Task类,TaskAsync而不是Task后缀,令牌参数等),这使得升级变得令人讨厌。不难,只是讨厌
  2. 等待/异步行为更好,更接近C#5。在Async CTP中,循环内发生的异常将导致整个循环静默失败。有关受此影响的方案,请参阅Retry a task
  3. 没有安装问题。必须按特定顺序安装Async CTP和VS 2010 SP1以避免出现问题。
  4. 对于目标包,您可以期待MS的某种支持,而对于Async包,您可以预期不支持。
  5. 一个小的警告是在具有VS2010 + Async CTP的计算机上安装VS2012会破坏Async CTP。您将无法再使用VS2010版本来编译异步代码。

    作为异步行为很重要的示例,请考虑以下非常简单的重试任务的方法。当函数使用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年和目标包(即整个团队已准备好切换),以避免多个代码版本和恼人的异常行为。