25

我们有一个面向 .Net Framework 4.0 的 Windows 窗体应用程序。安装 .Net Framework 4.5 后,应用程序开始崩溃。我们将不得不调查崩溃,我们很可能不得不在我们这边解决问题。但是,在我们准备好使用 .Net 4.5 之前,我们可以打开一个设置来保持旧的行为吗?


2012 年 7 月 12 日更新: 我们发现导致应用程序崩溃的重大更改:给定 System.Threading.Timer,当使用已关闭的句柄调用 Dispose(WaitHandle) 时,计时器会尝试向 WaitHandle 发出信号引发异常。Timer 的 .Net 4.0 实现可以容忍这种情况,但 4.5 不能。

我们这边有一个错误;我们没有任何充分的理由给它一个封闭的句柄,所以我们会修复它......直到我们发现另一个错误......

4

2 回答 2

29

但是,在我们准备好使用 .Net 4.5 之前,我们可以打开一个设置来保持旧的行为吗?

不。.NET 4.5 是 .NET 4 的就地替代品。安装它时,您实际上是在新框架上运行。

一般来说,它应该是完全向后兼容的,但有一些重大变化

不幸的是,这意味着如果您想支持在安装了 4.5 和未安装 4.5 的机器上运行,您(和其他所有人)将需要测试和修复两个框架上的问题。幸运的是,重大更改通常都是不寻常的边缘情况,因此在大多数情况下不太可能影响大多数用户。

于 2012-07-12T18:26:11.580 回答
6

我通过电子邮件与原始问题海报-“Sly”进行了讨论。感谢 Sly 帮助调查。事实证明,.NET4 和 .NET4.5 对于 Dispose(waithandle) API 的行为方式相同。所以这个问题可能与 .NET4.5 无关。

    static void Main(string[] args)
    {
        System.Threading.Timer timer = new System.Threading.Timer(new System.Threading.TimerCallback(blah));
        System.Threading.EventWaitHandle eventWaitHandle = new System.Threading.EventWaitHandle(true, System.Threading.EventResetMode.ManualReset);

        eventWaitHandle.Dispose();
        System.Threading.Thread.Sleep(2000);
        timer.Dispose(eventWaitHandle);
    } 

    private static void blah(object state)
    {
        Console.WriteLine(40);
    }
于 2012-11-11T00:40:56.010 回答