C#学习教程:从Process.Start()调用时C#应用程序随机挂起组织是:-Windows服务监控计划并根据需要启动worker.exe。-Worker.exe(轻量级winform应用程序)使用命令行参数提取DLL(插件)并运行一些代码。这已经持续了几个月。我最近将它迁移到Server2012(从2008IIRC开始)——这可能不相关,但很难说。迁移后一段时间以来,我遇到了一个问题,即worker.exe在被process.start()调用后“启动”,但没有到达我的代码。没有错误或任何东西,它似乎只是在应用程序加载期间冻结。启动它的服务代码是相当标准的。//创建一个临时文件夹并将可执行文件复制到其中//(因此源exe并不总是在使用中并且可以换出)Processp=newProcess();ProcessStartInfopsi=newProcessStartInfo();psi.FileName=Path.Combine(temp.Path,Path.GetFileName(ExecutablePath));psi.Arguments=CommandLineArgs.ConcatenateList("");psi.UseShellExecute=false;psi.RedirectStandardError=true;psi.RedirectStandardInput=true;psi.RedirectStandardOutput=true;psi.CreateNoWindow=true;psi.ErrorDialog=false;psi.WindowStyle=ProcessWindowStyle.Hidden;p.StartInfo=psi;p.开始();//如有必要,读取标准输出,如果出现冻结,则终止并重新安排等等。此时,worker可执行文件启动-它在任务管理器中显示正常。唯一让我知道有问题的是内存消耗-在正常情况下,worker在启动时会占用大约5MB并增长以反映任务,但是当进程冻结时它只会达到大约2MB并停止。为了证明这不是我在worker中的任何代码,我将对日志函数的调用添加为第一行并且从未看到日志。没有错误消息,而且——真的很奇怪——这不是一个一致的问题。现在冻结的完全相同的呼叫将在30秒后正常工作。问题发生的时间似乎也没有任何真实的模式——我所看到的最接近的情况是它偶尔会在多个任务中发生(例如,它可能会影响问题发生时开始的所有任务,任何任务都会发生).我有一项服务可以自动检测并适当地处理它,所以这不是一个紧急问题,但如果任何人都认为原因或解决方案突出,我仍然想修复它。worker的init代码只是一个标准的winform启动,而我的东西开始在form_load中被调用。staticclassProgram{//////应用程序的主要入口点。///[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);应用程序运行(新Form1());}}publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){//DoStuff-当冻结发生时永远不会被击中。编辑:根据评论,设置服务以使用它看到挂起进程时创建的日志条目记录了小型转储。明天会检查一下,看看它来自哪里。编辑2015年9月4日:小型转储信息:小型转储显示代码在staticvoidmain的退出处停止/卡住},即:staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(新Form1());}//<------这是主线程被冻结的地方。否则一切似乎都很好。为了以防万一,我将做一些研究并尝试对工作人员进行一些更改。编辑04/09/2015#2:调整了工作人员启动,它似乎正在工作。它的要点是删除Form引用并仅使用应用程序上下文(如codeproject示例)我已经用任务请求粉碎了系统并且它可以正常工作。我将让它在周末作为测试运行,并在周二提供状态更新。仍然很好奇为什么它会随着表单加载而随机中断。当前代码:staticclassProgram{//////应用程序的主要入口点。///[STAThread]staticvoidMain(){Application.Run(newAppContext());}}classAppContext:ApplicationContext{publicAppContext(){//DoStuff}}我无法在您的帖子中添加评论(我会被其他stackoverflow用户破坏,但是...)我遇到了问题和你的很相似。我的问题来自服务启动的会话。在迁移期间,服务在新操作系统的“会话0”中启动,而不是作为“系统”程序启动。它是在我们的程序许可下发布的,以便运行该服务。也许你应该检查一下。抱歉,如果我将此作为答案而不是评论最后一点,将桌子拉出似乎已经解决了问题。在这一点上,我假设服务器2012不喜欢在某些情况下不显示的winform应用程序;因为它大部分时间都有效,并且表单代码没有任何变化。服务://创建一个临时文件夹并将可执行文件复制到其中//(因此源exe并不总是在使用中并且可以换出)Processp=newProcess();ProcessStartInfopsi=newProcessStartInfo();psi.FileName=Path.Combine(temp.Path,Path.GetFileName(ExecutablePath));psi.Arguments=CommandLineArgs.ConcatenateList("");psi.UseShellExecute=false;psi.RedirectStandardError=true;psi.RedirectStandardInput=true;psi.RedirectStandardOutput=true;psi.CreateNoWindow=true;psi.ErrorDialog=false;psi.WindowStyle=ProcessWindowStyle.Hidden;p.StartInfo=psi;p.开始();//必要时读取标准输出,如果出现冻结则终止并重新调度等。Workers:以上是C#学习教程:从Process.Start()调用时,C#应用程序随机挂起以共享全部内容,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—staticclassProgram{//////应用程序的主要入口点。///[STAThread]staticvoidMain(){Application.Run(newAppContext());}}类AppContext:ApplicationContext{publicAppContext(){//DoStuff}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
