【问题标题】:Using Async V3 without installing it在不安装的情况下使用 Async V3
【发布时间】:2012-06-25 23:31:58
【问题描述】:

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

谢谢,

伊多。

【问题讨论】:

  • 为什么不用VS2012来代替?
  • 我对问题 1 的猜测是,VS 并没有真正调用csc,而是以编程方式从自己的 DLL 调用编译器。
  • VS 使用应该使用 csc 的 MSBuild。我还将日志级别设置为诊断,它显示它使用正确的 csc.exe
  • .Net 4 的异步目标包不适合您?
  • 我不想进入目标包,但我想我别无选择。

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


【解决方案1】:

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

  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 包不支持。

一个小的警告是在一台装有 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 年和目标包(即整个团队都准备好切换),以避免多个代码版本和烦人的异常行为。

【讨论】:

  • 感谢您的详细回答。我想我现在要转到 VS2012
猜你喜欢
  • 2015-10-20
  • 2023-04-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2023-03-22
相关资源
最近更新 更多