我正在通过COM互操作使用C#中的LogParser 2.2,并且希望能够让长时间运行的查询超时。
e.g。
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);
答案 0 :(得分:0)
使用Thread.Abort
取消执行很少是安全的。在这种情况下它是不安全的,因为无法知道Log Parser的数据结构的状态。您可以在一个单独的进程中执行查询,该进程使用标准输入/输出,命名管道,WCF或您喜欢的IPC技术进行通信。然后要取消查询,请在该过程中使用Process.Kill
。
注意:不知道Log Parser是否写入了会留下的临时文件。除此之外,Windows应该正确清理所有状态。
答案 1 :(得分:0)