首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >COM线程的Watchdog

COM线程的Watchdog
EN

Stack Overflow用户
提问于 2011-10-10 23:41:12
回答 1查看 1.2K关注 0票数 0

我正在开发一个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并简单地终止,假设如果超时命中了外交,线程已经离开窗口。

任何想法都很受欢迎!

EN

回答 1

Stack Overflow用户

发布于 2011-10-11 02:46:15

要做到这一点,最简单的方法是使用一个带有超时值的ManualResetEvent调用WaitAny()。

代码语言:javascript
运行
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7715291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档