Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过进程生成的进程。在.NET中启动将挂起线程_.net_Multithreading_Shell_Browser_Process - Fatal编程技术网

通过进程生成的进程。在.NET中启动将挂起线程

通过进程生成的进程。在.NET中启动将挂起线程,.net,multithreading,shell,browser,process,.net,Multithreading,Shell,Browser,Process,我们的应用程序有一个后台线程,它通过System.Diagnostics.process生成一个进程: Process.Start( new ProcessStartInfo { FileName = url, UseShellExecute = true } ); 这过去一点问题都没有。但现在,背景线程正在悄然消亡;它从不从调用进程开始返回。此代码的catch块(用于处理System.Exception)也未到达。即使在VisualSt

我们的应用程序有一个后台线程,它通过
System.Diagnostics.process
生成一个进程:

Process.Start(
    new ProcessStartInfo
    {
        FileName = url,
        UseShellExecute = true
    }
);
这过去一点问题都没有。但现在,背景线程正在悄然消亡;它从不从调用
进程开始返回。此代码的catch块(用于处理
System.Exception
)也未到达。即使在VisualStudio调试器中抛出时启用了异常处理,也看不到异常。奇怪的是,这一过程正在顺利地孕育;用户的默认浏览器将使用预期的URL启动

我们流程的入口点按建议标记为
[STAThread]

是什么导致我们的线程以静默方式终止?有什么技术可以用来调试线程终止期间发生的事情吗

更新:

看来这根线毕竟是活的;只是电话没回。下面是它的堆栈跟踪:

  • [在睡眠中等待或加入]
  • System.dll!System.Diagnostics.ShellExecuteHelper.ShellExecuteOnStatThread()+0x63字节
  • System.dll!System.Diagnostics.Process.StartWithShellExecuteEx(System.Diagnostics.ProcessStartInfo startInfo)+0x19d字节
  • System.dll!System.Diagnostics.Process.Start()+0x39字节
  • System.dll!System.Diagnostics.Process.Start(System.Diagnostics.ProcessStartInfo-startInfo)+0x32字节
  • 我的方法
更新2:

在不使用shell执行works的情况下启动cmd.exe是一种变通方法。非常感谢!不过,我还是想知道为什么电话没有回

更新3:

Shell钩子听起来确实像是对导致调用不返回的原因的逻辑解释。我找不到rogue模块,但在最后一次尝试通过shell执行运行之后,调用确实返回了


在任何情况下,用户都可能加载了shell扩展,这可能会干扰进程的启动,导致我的代码无法返回。我们对此无能为力,所以正确的答案是使用启动cmd.exe进程的变通方法。

不,线程不会自动终止,它们会发出响亮的卡布隆声。至少您会在输出窗口中看到线程退出通知。Process.Start()方法阻塞是另一种解释,尽管对此没有解释。您很抱歉,代码段太短,无法给出一个合理的诊断。也许是一些环保的东西


堆栈跟踪有帮助,ShellExecuteonStatThread()实际上在一个小辅助线程上执行阻塞线程.Join()。此线程是调用本机ShellExecuteEx()API函数所必需的,它只能从STA线程调用。但它有一个缺陷,STA线程还必须泵送一个消息循环。这个小帮手没有

这导致您的机器出现问题仍然指向环境问题,即某种劫持ShellExecuteEx()调用的系统插件。并指望运行真正的STA线程。您应该能够在Debug+Windows+Threads窗口中找到该助手线程。它应该在堆栈上包含“ShellExecuteFunction”。例如,病毒扫描器就是一种“系统附加组件”,它能吸引像这样的特技。在项目的调试选项卡中选中“启用非托管调试”后,您应该能够在调试+Windows+模块窗口中找到alienware


顺便说一句,使用UseShellExecute=false的解决方法在这里是可以接受的。只是从外观上看,您的机器有点乱,这一事实当然不是。正如Hans Passant提到的,挂起的
进程。启动
调用可能是原因。当使用
Process.Start
并将
UseShellExecute
设置为
true
时,Windows API函数
ShellExecuteEx
在引擎盖下调用,在某些情况下可能不会返回

您可以通过向代码中添加跟踪消息来检查是否存在这种情况:

System.Diagnostics.Trace.WriteLine("About to start process.");
Process.Start(
   new ProcessStartInfo
   {
       FileName = url,
       UseShellExecute = true
   }
);
System.Diagnostics.Trace.WriteLine("Process started.");
要收听跟踪消息,您可以使用
TraceListener
,检查Visual Studio的输出窗口或使用诸如DebugView之类的工具

作为一种解决方法,您可以使用
start
命令。以下代码启动一个隐藏的shell窗口,该窗口“启动”url:


我在Visual Studio中检查了输出窗口,启动
进程.Start
后没有输出任何内容。我考虑过调用被阻塞的可能性,但即使在终止所有Chrome实例后,调用也从未返回(尽管使用
UseShellExecute
我不知道调用为什么会被阻塞)。好吧,使用调试器。看看调用堆栈。配置了Microsoft symbol server的非托管调试器可能是最好的。非常好的建议,@Hans。找到更多信息。请参阅我问题的更新。我无法找出是什么劫持了我的进程,过了一段时间,事情开始按预期运行。我不认为我的外壳里有任何彻头彻尾的恶意活动;更有可能的是,某些shell扩展的代码很差。谢谢你的提示;我以前从未见过“模块”窗口。我遇到了完全相同的问题,结果是Avast劫持了我的,所以你在那里。很抱歉重提这件事,我只是想在应该得到的地方给大家一点信任,我花了一整天的时间试图解决这个问题!添加
Trace.WriteLine
不会让人感到意外;未到达“Process started.”行。启动cmd.exe时,调用仍然不会返回.Bah,但如果我将UseShellExecute设置为false,则会返回.Bah。
Process.Start(
    new ProcessStartInfo()
    {
        FileName = "cmd.exe",
        Arguments = "/c start http://www.google.com",
        WindowStyle = ProcessWindowStyle.Hidden,
        UseShellExecute = false
    });