2016-07-07 59 views
0

我在.NET 4.0中構建一個小型示例應用程序以測試某些任務異常處理。我下面寫運行時使用的應用程序框架版本目標和網絡框架版本

 Task.Factory.StartNew(() => 
     { 
      throw new Exception("Exception"); 
     } 
     Thread.Sleep(100); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

我預想的代碼,因爲我的應用程序是.NET 4.0,我會得到一個未處理的異常,但沒有發生。我在文章UnobservedTaskException is not killing the process中看到,即使您的應用程序是.Net 4.0(如果已安裝Net Framework 4.5),它也會在稍後運行。
事實上,當我添加:

<runtime> 
    <ThrowUnobservedTaskExceptions enabled="true"/> 
</runtime> 

唯一的例外是在4.5

拋出與應用程序可以有人解釋是什麼樣的應用程序版本和安裝框架版本的一般原則?

回答

2

「通用原則」是當.NET 4.5及更高版本在您的項目中最初以4.0爲目標時,它的行爲將與.NET 4.0一樣儘可能多。它知道你的目標是多虧了編譯器嵌入到程序集中的[TargetFrameworkAttribute]

這當然很重要,在.NET 4.5中的這種設計更改是嚴重打破。你不會想要一個.NET 4.0應用程序,它以前忽略了這個異常,並且一直保持在突然間,當它運行在一個更新的運行時版本上時突然失敗。你可能會假設更常見,特別是因爲沒有一種體面的方法來發現這些例外情況。這是一個非常糟糕的設計選擇和微軟在4.5

它只是,你可以用它來重寫此兼容性行爲的一些配置設置糾正它,ThrowUnobservedTaskExceptions就是其中之一。將行爲反向移植到4.0應用程序被認爲是有用的,當然是。如果你在只有4.0的機器上運行你的應用程序,那麼它不起作用。另一個例子is here

這樣做的代碼是located here。內部System.CLRConfig類是4.5中的新增功能。實際的實現在CLR裏面,因爲解析.config文件的代碼也位於那裏。

+0

感謝Hans對這些解釋。我確實認爲,當我們在機器框架4.0和4.5上安裝時,4.0中的應用程序構建將運行在框架4.0之上而不是4.5,但在我看來,應用程序似乎運行在4.5之上。可能有任何配置要添加? – Che

+0

不,這是不可能的,4.5和4.6不是並排版本。他們*覆蓋* 4.0安裝。在一臺只有4.0的計算機上運行的可能性現在非常小,它必須是XP或Server2003或拒絕使用Windows Update的用戶。不是您想要支持的那種客戶。最好的方法是不需要通過定位4.5 :) –

+0

謝謝,有趣的,然後我們可以說應用程序運行在機器上安裝的最新Framework版本之上,無論它是否構建在較低版本中,什麼時候會導致意外的變化我們升級了框架而不需要改變應用程序。 – Che