2015-09-25 86 views
2

這是一個使用一個相當出問題第三方庫的代碼在我的解決方案的代碼的簡化版本:最安全的方式中止在第三方庫代碼執行

public GlitchyThirdPartyComponent GetThirdPartyComponent(Stream stream) 
{ 
    return new GlitchyThirdPartyComponent(stream); 
} 

對於一些流構造的GlitchyThirdPartyComponent完全嚇壞了,並開始消耗大量的CPU功率和內存,並永遠不會退出,直到OutOfMemoryException發生(聞起來像一個無限循環的地方)。

我試圖找出最安全的方法來調用GetThirdPartyComponent,然後在某個超時後如果它仍在運行中止其執行。

我檢查了幾種可能的解決方案,但似乎沒有解決方案。有幾個原因:

  1. 我沒有訪問第三方庫源代碼。所有的組件會被混淆,所以沒有拆卸任何
  2. GlitchyThirdPartyComponent不可序列化,所以沒有跨AppDomain的或跨流程解決方案
  3. GlitchyThirdPartyComponent最有可能使用COM(通過其inteface的樣子),所以Thread.Abort是一個非常不可靠選項
  4. 雖然可以使用其他第三方庫或問我現在的庫供應商的bug修正,這些解決方案需要時間,我的問題應該儘快解決

所以,我要在這做情況? Thread.Abort真的是這裏最好的解決方案嗎?

+0

你已經消除了所有明顯的解決方案,只剩下兩個。使用電話。沒有人拿起時刪除圖書館。 –

+0

您使用的是什麼版本的.Net? – Padraic

+0

@Padraic我正在使用.NET 4.5.2 –

回答

-1

您可以將GlitchyThirdPartyComponent打到Task。然後有一個超時。像這樣的東西

int timeout = 1000; 
var task = Task.Run(() => new GlitchyThirdPartyComponent(stream)) 
if (await Task.WhenAny(task, Task.Delay(timeout)) == task) { 
    // task completed within timeout 
} else { 
    // timeout logic 
} 
+0

OP已經知道這是一個選項。問題是放入'//超時邏輯'部分。 – hvd

相關問題