2

これは、非常にグリッチなサードパーティ ライブラリ コードを使用する私のソリューションのコードの簡略化されたバージョンです。

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

一部のストリームでは、コンストラクターがGlitchyThirdPartyComponent完全にフリークアウトし、多くの CPU パワーとメモリを消費し始め、OutOfMemoryException発生するまで終了しません (どこかで無限ループのようなにおいがします)。

GetThirdPartyComponentまだ実行中の場合、特定のタイムアウト後に呼び出して実行を中止する最も安全な方法を見つけようとしています。

考えられる解決策をいくつか調べましたが、適切な解決策はないようです。これにはいくつかの理由があります。

  1. サードパーティ ライブラリのソース コードにアクセスできません。すべてのアセンブリは難読化されているため、逆アセンブルもありません
  2. GlitchyThirdPartyComponentシリアル化できないため、クロスアプリドメインまたはクロスプロセス ソリューションはありません
  3. GlitchyThirdPartyComponentほとんどの場合、(インターフェイスの外観から) COM を使用するためThread.Abort、非常に信頼性の低いオプションです。
  4. 別のサードパーティ ライブラリを使用するか、現在のライブラリ ベンダーにバグ修正を依頼することは可能ですが、これらの解決策には時間がかかり、私の問題はできるだけ早く修正する必要があります。

では、この状況で私は何をすべきでしょうか?ここで本当にThread.Abort最善の解決策はありますか?

4

1 に答える 1

-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
}
于 2015-09-25T16:32:50.203 に答える