是否有可能安全地从c#中取消长时间运行的LogParser查询?
本文关键字:运行 长时间 LogParser 查询 取消 安全 有可能 是否 | 更新日期: 2023-09-27 18:04:48
我正在使用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