可遇不可求的Question之不支持一个STA 线程上针对多个句柄的WaitAll
不支持一個 STA 線程上針對多個句柄的 WaitAll。
題設:
在.NET開發多線程控制臺程序過程中,由于業務要求,需要實現"一次掃描多筆訂單",然后,通過多線程實現并發提交的邏輯.因此,在控制臺程序中采用了多線程記錄.由于下一次操作必須等待所有的記錄并發提交完成后,才能進行下一步循環操作.在多線程操作后,使用了WaitAll命令.但是在此過程中,報異常"不支持一個STA 線程上針對多個句柄的WaitAll ".
分析:
經過研究MSDN,發現,在控制臺程序的每個主函數Main之前,都有一個[STAThread]方法屬性,該屬性標識當前控制臺程序的線程模型為單線程,因此在該模型下編寫多線程程序,并不能很好的兼容.具體的說明如下:
STAThreadAttribute
指示應用程序的 COM 線程模型是單線程單元 (STA)。
將此屬性應用于入口點方法(C# 和 Visual Basic 中的 Main() 方法)。它對其他方法無效。若要設置在代碼中啟動的線程的單元狀態,請在啟動線程前使用 Thread..::.SetApartmentState 方法。
注意:
在 .NET Framework 1.0 版和 1.1 版中,在啟動線程之前設置 Thread..::.ApartmentState 屬性。
COM 線程模型只適用于使用 COM interop 的應用程序。如果將此屬性應用到不使用 COM interop 的應用程序,將沒有任何效果。
COM 線程模型可設置為單線程單元或多線程單元。如果應用程序線程實際調用了 COM 組件,則僅為 COM interop 初始化該線程。如果沒有使用 COM interop,則不初始化該
?在此說明中,有明確標識"COM 線程模型只適用于使用 COM interop 的應用程序。如果將此屬性應用到不使用 COM interop 的應用程序,將沒有任何效果。"因此,嘗試將該屬性刪除,編譯運行成功.問題解決.
解決:
因為在默認的.NET程序在創建時都默認被設置線程模型為單線程單元,即STA,故在不涉及到COM相關操作的情況下,可以去掉控制臺程序Main 上的[STAThread]屬性即可支持多線程操作.
?
轉載于:https://www.cnblogs.com/tigerjacky/archive/2011/05/10/2013745.html
總結
以上是生活随笔為你收集整理的可遇不可求的Question之不支持一个STA 线程上针对多个句柄的WaitAll的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn合并分支到主干
- 下一篇: Android 代码中执行adb she