COM线程看门狗

本文关键字:看门狗 线程 COM | 更新日期: 2023-09-27 18:10:56

我正在开发一个WCF应用程序,它不遵循真正SOA的思想世界,因为它将有几个基本的调用。

1) Start Process2)检查进程是否仍在运行3)获取结果

这一切都很好,但为了执行从'启动进程'返回,我使用

在一个单独的线程中运行我的代码

oThread = new Thread(new ThreadStart(wbrt.Calculate));

问题是我们知道(虽然很少)COM调用会占用50~100%的cpu并消耗大量内存。我无能为力。

我想做的是有一个看门狗线程,如果它在一段时间后(比如5分钟)仍在运行,它将杀死COM调用。

这里有最佳实践吗?我一直在看以下博客:

http://weblogs.asp.net/israelio/archive/2004/06/19/159985.aspx

在其中他使用'AutoResetEvent'和'WaitOne'的问题这里是WaitOne是阻塞的,所以我必须有一个线程内的线程。

我可以在这里使用一个简单的线程计时器吗?我看到计时器将执行,即使线程已经关闭(即完成ok)是一个问题,如果我使用一个标志或其他东西来停止使用现在死的对象?

我也正在使用Activator创建我的COM对象。我尝试中止线程,但它没有杀死COM对象,我已经读到中止是坏的。

我的解决方案是获得COM实例的PID并简单地杀死,假设超时已经达到外交,线程已经离开窗口。

任何想法都很好!

COM线程看门狗

最简单的方法是使用一个ManualResetEvent调用WaitAny()和一个超时间值。

ManualResetEvent _evtActor = new ManualResetEvent();
public void Start()
{
    this._evtActor.Reset();
    ThreadPool.QueueUserWorkItem(new WaitCallback(DoStuff));
    int result = ManualResetEvent.WaitAny(
                    new WaitHandle[] { this._evtActor },
                    30 * 1000); // Wait 30sec
    if (result == ManualResetEvent.WaitTimeout)
    {
        Console.WriteLine("Timeout occurred!");
    }
    else
    {
        Console.WriteLine("Done!");
    }
}
public void DoStuff()
{
    Console.WriteLine("Doing stuff.");
    Thread.Sleep(45 * 1000); // sleep for 45sec;
    this._evtActor.Set();
}