【问题标题】:Visual Studio 2012 .NET multi-targeting and async callbacksVisual Studio 2012 .NET 多目标和异步回调
【发布时间】:2012-07-11 19:25:35
【问题描述】:

我有一个使用 .NET Framework 3.5 的 .NET 应用程序,用 C# 编写。应用程序正在使用 BeginInvoke 异步调用委托。该应用程序在使用 Visual Studio 2012 RC 编译时运行良好,但在使用 Visual Studio 2010 SP1 编译时会冻结(主线程卡在 WaitOne 中等待异步委托完成,但它们从不执行)。

虽然错误可能是错误设计的同步,但令我惊讶的是为什么它在 VS 2012 中有效而在 VS 2010 中无效,而我在两者中都针对相同的框架版本。

如何在 Visual Studio for .NET 中实现多目标?当针对相同的框架版本时,是否应该期望可执行行为相同,或者是否存在某些部分(编译器前端或运行时库的某些部分),这取决于所使用的 Visual Studio 版本?

【问题讨论】:

  • 为什么你对微软默默地修复了一个错误感到惊讶?
  • 你有这个小复制吗?
  • @DavidKean 答案中已经存在解释(foreach 变量的不同范围),因此我不再对这个问题感兴趣。
  • 抱歉,我没有看到您回答了自己的问题。 :)

标签: c# .net visual-studio visual-studio-2012 multitargeting


【解决方案1】:

是的,有区别。使用的 C# 编译器不同。见VS2008 targeting .NET 2.0 doesn't stop me from using C# 3 features。注意:这与多目标在 Visual C++ 中的工作方式不同,后者在目标时使用旧版本的完整工具链。

困扰我的问题是 foreach 变量的生命周期范围不同。我在委托中捕获变量,而在 VS 2012 中,每个委托都捕获了自己的变量版本,in VS 2010 it did not

VS 2012 使用 C# 5 编译器,它实现了新的行为。更改记录在 Visual C# Breaking Changes in Visual Studio 2012 RC 中。在What else is new in C# 5?Lifting ForEach, Breaking Change in Visual Studio 2012 中也有描述。

【讨论】:

  • "我还没有找到是否定义了新行为。" -- 在官方Visual C# Breaking Changes 页面上特别提到了它,所以我认为它已定义,直到我看到有理由假设。而且VS 2012默认使用C# 5.0,不是4.0,只是规范文档还没有更新。 (据我所知,但我没有特别检查,该行为也在 C# 4.0 中定义,但定义不同,因此所有符合 C# 4.0 的编译器都必须重用 foreach 变量。)
  • @hvd 感谢您的澄清,更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多