2

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

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

当我使用命令行中的msbuild构建项目时,所有构建和工作都很棒。

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

我不在乎VS没有突出显示异步的语法并等待,但它确实打扰了我必须从命令行构建项目。

  1. 命令行csc如何工作,但使用VS它不?

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

谢谢

伊多。

+0

为什么不使用VS2012呢? – svick

+1

我对问题1的猜测是,VS并不真正调出'csc',而是以编程方式从它自己的DLL中调用编译器。 – millimoose

+0

VS使用应该使用csc的MSBuild。我也将日志级别转为诊断,并显示它使用正确的csc.exe –

回答

3

VS2012和异步瞄准包是最佳的选择,其原因如下:

  1. 的语法是一样的在C#5,使得升级到C#5更容易。异步CTP有足够的差异(TaskEx代替任务类,TaskAsync代替任务后缀,令牌参数等),这使升级变得麻烦。不难,只是一个滋扰
  2. 等待/异步行为是更好,更接近C#5。在异步CTP中,循环内部发生的异常将导致整个循环以静默方式失败。有关受此影响的场景,请参见Retry a task
  3. 没有安装问题。 Async CTP和VS 2010 SP1必须按特定顺序安装以避免出现问题。
  4. 您可以期待MS为定位包提供某种支持,而对于Async包则不需要任何支持。

警告是用VS2010 +异步CTP的计算机上安装VS2012打破了异步CTP。您将无法再使用VS2010版本来编译异步代码。

作为异步行为很重要的示例,请考虑以下非常简单的重试任务的方法。虽然功能与异步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--; 
     } 
    } 
} 

这么说,我一直在使用异步CTP超过一年,现在唯一的问题是添加Visual Studio 2010 SP1后的安装顺序。如果您订购错误,Asycn CTP不会安装,您将不得不删除SP1并按正确的顺序重新安装所有内容。

尽管如此,我会尽快迁移到2012年和定位包(即整个团队已准备好切换),以避免多个代码版本和烦人的异常行为。

+0

谢谢你的详细解答。我想我现在将转入VS2012 –