是否可以从C#安全地取消长时间运行的LogParser查询?

时间:2011-08-07 08:29:06

标签: c# logparser

我正在通过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);

2 个答案:

答案 0 :(得分:0)

使用Thread.Abort取消执行很少是安全的。在这种情况下它是不安全的,因为无法知道Log Parser的数据结构的状态。您可以在一个单独的进程中执行查询,该进程使用标准输入/输出,命名管道,WCF或您喜欢的IPC技术进行通信。然后要取消查询,请在该过程中使用Process.Kill

注意:不知道Log Parser是否写入了会留下的临时文件。除此之外,Windows应该正确清理所有状态。

答案 1 :(得分:0)