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);