關於這類問題網上搜索會有很多解決方案,但基本的意思都相差不大,大致問題出於啟用線程時調用類似剪貼板Clipboard.SetDataObject出錯,我把我的測試代碼展現下: 解決方案:只需將thread.SetApartmentState(ApartmentState.STA);反註釋就可以了。 ...
關於這類問題網上搜索會有很多解決方案,但基本的意思都相差不大,大致問題出於啟用線程時調用類似剪貼板Clipboard.SetDataObject出錯,我把我的測試代碼展現下:
解決方案:只需將thread.SetApartmentState(ApartmentState.STA);反註釋就可以了。
出現的原因:
單元是進程內部具有相同線程訪問要求的對象的邏輯容器。同一單元中的所有對象都可以接收從該單元中的任何線程發出的調用。
.NET Framework 不使用單元,托管對象自己負責以線程安全的方式使用所有共用資源。由於 COM 類使用單元,因此公共語言運行
庫需要在 COM interop 的情況下調用 COM 對象時創建並初始化一個單元。托管線程可以創建併進入只允許有一個線程的單線程單
元 (STA) 或者包含一個或多個線程的多線程單元 (MTA)。通過將線程的 ApartmentState 屬性設置為 ApartmentState 枚舉值之一
,可以控制所創建的單元的類型。由於給定線程只能初始化 COM 單元一次,因此在第一次調用非托管代碼之後就不能更改單元類型。
註:在網路上找了兩篇文章或許更能說明這個問題。文章的大意是,由於很多COM在.NET環境下如果使用多線程的話,會導致引用的COM不能正常運行,
而如果不聲明程式為STAThread的話,.NET就會自動使用多線程來提高效率,這樣就會導致不可預知的後果。
A young ilder ~ an old beggar !