处理剩余未知运行时的进程

时间:2014-09-06 06:59:56

标签: c# phantomjs

我有一个长期运行进程的循环系统,需要在每次100轮之后处理和重新启动,因为可执行文件有内存泄漏(phantomjs.exe)。 杀死进程的剩余运行时间未知,必须完成运行。最多估计15秒就足够了。

到目前为止,我这样做了

// p refers to a model which has a property System.Diagnostics.Process process

var p = _processes[_nextProcess];

if (p.callCount > _maxCalls)
{
    _discardedProcesses.Add(p);
    _processes[_nextProcess] = new PhantomProcessModel(...);
    p.Destroy(_discardedProcesses);
}

public class PhantomProcessModel
{
    ...

    public Process process { get; set; }

    public int callCount { get; set; }

    public void Destroy(List<PhantomProcessModel> discardedProcesses)
    {
        //process.WaitForExit(15000);
        // or timer or different thread
        process.Close();
        process.Dispose();
        discardedProcesses.Remove(this);
    }
}

void Destroy()中的进程拦截必须考虑到这些问题:

  1. 在计时器结束之前一定不能阻止,例如15秒
  2. 在超时结束之前,不得对其进行垃圾回收。
  3. 最后它必须在没有内存泄漏的情况下消失。
  4. 实现这一目标的正确方法是什么?我的做法好吗?

    谢谢!

1 个答案:

答案 0 :(得分:1)

天真的实施可以利用threadpool

public void Destroy(List<PhantomProcessModel> discardedProcesses)
{
    ThreadPool.QueueUserWorkItem( (someobj) => 
    {
        process.WaitForExit(15000);
        process.Close();
        process.Dispose();
        // instance members of List<> are not thread safe
        lock(discardedProcesses) 
        {
            discardedProcesses.Remove(this);
        }
    });
}