私はLogParser 2.2でCOM相互運用機能を使ってC#で作業しており、長い実行クエリにタイムアウトを与えたいと考えています。C#から長時間実行されているLogParserクエリを安全にキャンセルすることはできますか?
var ctx = new COMIISW3CInputContextClassClass();
var log = new LogQueryClassClass();
var rs = log.Execute(qry, ctx);
は、それは時間がかかりすぎる
log.Execute
コールを中断することは可能ですか?
Thread.Abort()
を試しましたが、Executeコールが正常に終了するまでThreadAbortExceptionが待機するようです。
Thread.Abort()
をテストするために使用されるコードは次のとおりです。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);
一つの可能な回避策は、別のAppDomainに上記のコードを起動し、Log Parserツールがビジーの場合のAppDomainを殺すことができます。 –
AppDomainが同じように動作することに気づきました(COMコールがクリーンアップされるまで待ってください)。私はそれを試して調べる必要があると思う。 –