2011-08-07 4 views
0

私は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); 
+0

一つの可能​​な回避策は、別のAppDomainに上記のコードを起動し、Log Parserツールがビジーの場合のAppDomainを殺すことができます。 –

+0

AppDomainが同じように動作することに気づきました(COMコールがクリーンアップされるまで待ってください)。私はそれを試して調べる必要があると思う。 –

答えて

0

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

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

関連する問題