我有一个长期运行进程的循环系统,需要在每次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()
中的进程拦截必须考虑到这些问题:
实现这一目标的正确方法是什么?我的做法好吗?
谢谢!
答案 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);
}
});
}