是否有可能安全地从c#中取消长时间运行的LogParser查询?



我正在使用LogParser 2.2在c#中通过COM互操作,并希望能够给长时间运行查询超时。

var ctx = new COMIISW3CInputContextClassClass();
var log = new LogQueryClassClass();
var rs = log.Execute(qry, ctx);

如果需要太长时间,是否可以中断log.Execute呼叫?我尝试过Thread.Abort(),但似乎ThreadAbortException等待执行调用正常完成。

用于测试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);

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

注意:不知道日志解析器是否会写任何临时文件,这将留下。除此之外,Windows应该为你正确地清理所有状态。

参见取消令牌:http://msdn.microsoft.com/en-us/library/dd997289.aspx

相关内容

最新更新