我正在开发一个WCF应用程序,它不符合真正的SOA的理想世界,因为它将有一些基本的调用。
1)启动进程2)检查进程是否仍在运行3)获取结果
这一切都很好,但是为了让执行从“start process”返回,我在一个单独的线程中运行代码,使用
oThread = new Thread(new ThreadStart(wbrt.Calculate));
问题是,众所周知(尽管很少),COM调用占用了50%~100%的cpu并消耗了大量内存。我对此无能为力。
我想做的是有一个看门狗线程,如果COM调用在一段时间(比如5分钟)后仍在运行,它将终止COM调用。
这里有没有最佳实践?我一直在读下面的博客:
http://weblogs.asp.net/israelio/archive/2004/06/19/159985.aspx
其中他使用了'AutoResetEvent‘和' WaitOne’,这里的问题是WaitOne阻塞了,所以我必须在一个线程中有一个线程。
我可以在这里使用一个简单的线程计时器吗?我看到即使线程已经关闭了,定时器也会执行(也就是完成了),如果我使用一个标志或其他东西来停止使用现在已死的对象,这是一个问题吗?
此外,我正在使用Activator.CreateInstance创建我的COM对象,我尝试中止线程,但它不会杀死COM对象,并且我从那以后了解到中止是错误的。
我的解决方案是获取COM实例的PID并简单地终止,假设如果超时命中了外交,线程已经离开窗口。
任何想法都很受欢迎!
发布于 2011-10-11 02:46:15
要做到这一点,最简单的方法是使用一个带有超时值的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();
}
https://stackoverflow.com/questions/7715291
复制相似问题