0

COM 相互運用機能を介して C# で LogParser 2.2 を使用しており、実行時間の長いクエリにタイムアウトを与えたいと考えています。

例えば

var ctx = new COMIISW3CInputContextClassClass();
var log = new LogQueryClassClass();
var rs = log.Execute(qry, ctx);

log.Execute時間がかかりすぎる場合、通話を中断することはできますか? 試してみThread.Abort()ましたが、ThreadAbortException は Execute 呼び出しが正常に終了するまで待機しているようです。

テストに使用されるコードThread.Abort()は次のとおりです。

var ctx = new COMIISW3CInputContextClassClass();
var log = new LogQueryClassClass();
ILogRecordset rs = null;
var t = new Thread(() =>
    {
        rs = log.Execute(qry, ctx);
    });
t.SetApartmentState(ApartmentState.STA);
t.Start();

t.Join(100);
t.Abort();

// this tests if the file lock is still held by log parser
Assert.Throws<IOException>(() =>
    File.OpenWrite(path));

t.join(10000);

// file is no longer locked
using (File.OpenWrite(path))
    Assert.IsTrue(true);
4

2 に答える 2

0

での実行のキャンセルThread.Abortはほとんど安全ではありません。この場合、Log Parser のデータ構造の状態を知る方法がないため、安全ではありません。標準入出力、名前付きパイプ、WCF、またはお気に入りの IPC テクノロジを使用して通信する別のプロセスでクエリを実行できます。次に、クエリをキャンセルするにはProcess.Kill、そのプロセスで使用します。

注: Log Parser が一時ファイルを書き込むかどうかはわかりませんが、これが後に残ります。それ以外は、Windows はすべての状態を正しくクリーンアップする必要があります。

于 2012-01-27T18:18:55.893 に答える