我们有一个针对.Net Framework 4.0的Windows窗体应用程序。安装.Net Framework 4.5后,应用程序开始崩溃。我们将不得不调查崩溃事件,我们很可能必须解决问题。但是,在我们准备好使用.Net 4.5之前,是否有一个设置可以保持旧的行为?
更新07/12/2012: 我们发现导致应用程序崩溃的重大更改:给定System.Threading.Timer,当使用已经关闭的句柄调用Dispose(WaitHandle)时,Timer会尝试发出抛出异常的WaitHandle。计划的.Net 4.0实现是容忍的,但4.5不是。
我们这边有一个错误;我们没有任何理由给它一个封闭的句柄,所以我们只是解决这个问题...直到我们发现另一个错误......
答案 0 :(得分:29)
但是,在我们准备好使用.Net 4.5之前,是否有一个设置可以保持旧的行为?
没有。 .NET 4.5是.NET 4的就地替代品。当您安装它时,您将有效地运行新框架。
一般来说,它应该完全向后兼容,但有一个few breaking changes。
不幸的是,这意味着如果您想支持在安装了4.5且未安装4.5的计算机上运行,您(以及其他所有人)将需要测试和修复两个框架上的问题。幸运的是,突破性变化通常都是不寻常的边缘情况,因此在大多数情况下它不太可能影响大多数用户。
答案 1 :(得分:6)
我通过电子邮件与原始问题海报 - “狡猾”进行了讨论。谢谢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);
}