0

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

例如

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);
4

2 回答 2

0

See cancellation tokens: http://msdn.microsoft.com/en-us/library/dd997289.aspx

于 2012-01-27T18:39:04.370 回答
0

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

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

于 2012-01-27T18:18:55.893 回答