通过RDP在Windows Server环境中运行我的应用程序时,我一直收到CLR.dll错误。
原因似乎是我在TPL Parallel For Loop中产生了phantomJS。这是我用来生成进程的代码。
using (Process process = new Process())
{
process.StartInfo.FileName = "phantomjs.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += (sender, args) =>
{
Console.WriteLine(args.Data);
};
process.Start();
process.BeginOutputReadLine();
// Don't leave orphan phantomJs
if (process.WaitForExit(3 * 60 * 1000) == false)
{
process.Kill();
}
else
{
process.Close();
}
}
并行代码位于上方并且很简单。但它调用了许多方法,这些方法最终会触及上面的流程启动代码。
Parallel.ForEach(urls, new ParallelOptions() { MaxDegreeOfParallelism = 5 },
(url) => KickOfPhantomJs(url)
);
仅供参考这个代码是通过Quartz.NET运行的,不确定是否值得一提。
我试过了:
虽然WinForms应用程序与CLR.DLL崩溃,但实际功能运行完成。因为任务是通过quartz.net运行的,所以即使UI已经冻结并且正在显示错误消息框,实际应用程序也可以完成所有任务的运行。