日期:2014-05-18  浏览次数:20984 次

新手请教一个“非泵式异常”的问题,谢谢指教!
做一个c#程序执行DOS命令,想把DOS中的输出流同时也显示出来,刚才问了下,有前辈给了一个例子,我试着仿写了一下,出现这个异常 
  CLR 无法从 COM 上下文 0x1b1c38 转换为 COM 上下文 0x1b1da8,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。

这是代码
  System.Diagnostics.Process pro = new Process();
  expstring = "cmd.exe";
  pro.StartInfo.FileName = expstring;
  pro.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
  pro.StartInfo.CreateNoWindow = true;
  pro.StartInfo.UseShellExecute = false;
  pro.StartInfo.RedirectStandardInput = true;
  pro.StartInfo.RedirectStandardOutput = true;
  pro.Start();
  pro.StandardInput.WriteLine(@"exp abc/abc@zgworcl buffer=10000 file=c:\aa.dmp owner=abc");
  StreamReader reader = pro.StandardOutput;
  string line = reader.ReadLine();
  while (!reader.EndOfStream)
  {
  PrintMessage(line);
  line = reader.ReadLine();
  }
  pro.StandardInput.WriteLine(@"exit");
  //pro.WaitForExit();
  pro.Close();

这个怎么处理,新手请不吝赐教。最好能稍微说详细点,谢谢!


------解决方案--------------------
在Debug -> Exceptions -> Managed Debug Assistants里 去掉ContextSwitchDeadlock一项前面的钩。 
在调试(菜单)-->异常-->-> Managed Debug Assistants里 去掉ContextSwitchDeadlock一项前面的钩。


http://www.cnblogs.com/shanyou/archive/2007/12/09/988488.html

------解决方案--------------------
由于子进程还没有运行结束,它的标准输出流就不会处于结束状态,这就导致父进程中的ReadToEnd()方法不会执行完毕,所以父进程中的ReadToEnd()无法执行,从而管道中的错误输出无法被读取,子进程的后续错误输出无法写入管道,最终子进程和父进程彼此无限等待,出现了阻塞情况。

你参考下这篇文章
http://www.chinaitpower.com/A/2002-01-23/11664.html

如果你的输出有固定的结尾,我觉得可以简单化处理
while (!reader.EndOfStream) 

PrintMessage(line); 
line = reader.ReadLine(); 
if(line.IndexOf("结尾特征标识"))
break;


不知道你遇到的是不是这个问题,希望对你有点帮助
------解决方案--------------------
不是很懂,顶一下,以表支持
------解决方案--------------------
友情UP