Можно ли безопасно отменить длительный запрос LogParser из C #? - PullRequest
0 голосов
/ 07 августа 2011

Я работаю с LogParser 2.2 в C # через COM-взаимодействие и хотел бы иметь возможность дать длительным запросам тайм-аут.

, например

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 голосов
/ 27 января 2012
0 голосов
/ 27 января 2012

Отмена выполнения с Thread.Abort редко безопасна. В этом случае это небезопасно, поскольку нет способа узнать состояние структур данных Log Parser. Вы можете выполнить запрос в отдельном процессе, с которым вы общаетесь, используя стандартный ввод / вывод, именованные каналы, WCF или вашу любимую технологию IPC. Затем, чтобы отменить запрос, используйте Process.Kill для этого процесса.

ПРИМЕЧАНИЕ. Не знаю, записывает ли Log Parser какие-либо временные файлы, которые после этого останутся. Кроме того, Windows должна правильно очистить все состояния.

...