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并简单地杀死,假设超时已经达到外交,线程已经离开窗口。
任何想法都很好!
最简单的方法是使用一个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();
}