簡體   English   中英

Thread.Abort()方法凍結

[英]Thread.Abort() method freezes

因此,我用Google搜索它由於使用不安全的代碼而凍結,並且AbortException僅在控制流返回到托管代碼AbortException拋出。 因此,就我而言,我有一個在線程中調用的本機庫。 所以有時候我無法中止它,因為該庫是本機的,並且Abort方法不僅不執行任何操作,而且凍結了調用線程。

所以,我想解決它。

例如,使用其他過程應會有所幫助,但這非常復雜。

因此,較不繁重的解決方案是使用“ AppDomains”。 但是無論如何,我應該創建一個exe並調用它。 我試圖像這樣在內存中生成它

var appDomain = AppDomain.CreateDomain("newDomain");
var assemblyBuilder = appDomain.DefineDynamicAssembly(new AssemblyName("myAsm"), AssemblyBuilderAccess.RunAndCollect);
var module = assemblyBuilder.DefineDynamicModule("myDynamicModule");
var type = module.DefineType("myStaticBulder", TypeAttributes.Public);
var methBuilder = type.DefineMethod("exec", MethodAttributes.Static | MethodAttributes.Public);
var ilGenerator = methBuilder.GetILGenerator();

但是我發現只有EMIT方式,這非常非常復雜。

是否存在表面解決方案?

這不是設計使然。 CLR對於可以安全中止哪種代碼有非常嚴格的規則。 重要的是,除了不明智地使用Thread.Abort()之外,在許多情況下CLR 必須中止代碼,AppDomain最重要的是卸載。

硬性規定是必須使CLR確信中止代碼是安全的。 僅確信線程是忙於執行托管代碼還是在等待托管同步對象。 您的情況符合,沒有辦法為CLR有任何的想法是什么本地代碼在做什么。 在這種狀態下中止線程幾乎永遠不會導致問題。 關於Thread.Abort()的危險的想法相同,但是乘以一千。 內部操作系統鎖上的后續死鎖很有可能,而且完全不可言喻。

因此,AppDomain 也不是解決方案,它只能在線程停止運行並且無法運行之前才能卸載。

您唯一可以做的就是在一個單獨的過程中隔離該代碼。 編寫一個幫助程序EXE小項目,該項目通過標准.NET IPC機制(例如套接字,命名管道,內存映射文件,遠程處理或WCF)公開其api。 代碼掛起后,可以安全地對其進行Process.Kill()處理。 無法進行任何損壞,整個過程狀態都將被丟棄。 恢復通常非常棘手,但是您仍然必須重新啟動該過程並將其恢復到原始狀態。 尤其是狀態恢復通常很難可靠地完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM