我正在通过EXE执行BCP命令,并复制50000行后,它stucks。 我看了一些论坛,并知道如果我们在代码中使用StandardOutputReader比它的输出的最大限制接近50000行这是发生在我身上有一种方法我运行redirect输出,其中超过50000行可以出。
这个代码在这里工作,我有
proc.StartInfo.RedirectStandardOutput = false;
但我想要真实的看到输出。
private static voID RunBatch(string Fullfilepath,string BatchfilePathDumpFlatfile) { mLogger.Error("RunBatch Start=== >"); mLogger.Error("Batch filepath " + Fullfilepath + 'n' + "Batch file Directory " + BatchfilePathDumpFlatfile); Process proc = null; string targetDir = BatchfilePathDumpFlatfile; proc = new Process(); proc.StartInfo.WorkingDirectory = targetDir; proc.StartInfo.filename = Fullfilepath; //proc.StartInfo.CreateNowindow = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.Arguments = "/c"; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.RedirectStandardOutput = false; proc.Start(); proc.WaitForExit(); string output = proc.StandardOutput.ReadToEnd(); proc.WaitForExit(); string error = proc.StandardError.ReadToEnd(); proc.WaitForExit(); mLogger.Error("Output from batch " + output); mLogger.Error("Error From Batch " + error); }
更新1:
使用.NET监视windows 7中的声卡输出
SSL证书valIDation – 是否涉及任何caching?
一个线程可以在临界区中被抢占吗?
从windows服务启动浏览器
什么是构buildwindows Phone 7应用程序要连接的服务的最佳可伸缩体系结构?
private static voID RunBatch(string Fullfilepath,string BatchfilePathDumpFlatfile) { mLogger.Error("RunBatch Start=== >"); mLogger.Error("Batch filepath " + Fullfilepath + 'n' + "Batch file Directory " + BatchfilePathDumpFlatfile); Process proc = null; string targetDir = BatchfilePathDumpFlatfile; proc = new Process(); proc.StartInfo.WorkingDirectory = targetDir; proc.StartInfo.filename = Fullfilepath; //proc.StartInfo.CreateNowindow = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.Arguments = "/c"; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string output = proc.StandardOutput.ReadToEnd(); proc.WaitForExit(); string error = proc.StandardError.ReadToEnd(); proc.WaitForExit(); mLogger.Error("Output from batch " + output); mLogger.Error("Error From Batch " + error); }
这是我使用的是有一个错误,因为仍然BCP挂起,并开始运行,当我停止代码的EXE。
linux世界中是否有与.Net fileSystemWatcher相当的function?
如何从Web服务器打印格式化的文本并确认打印成功?
如何检测用户的密码是否已过期
如何设置.NET框架的作业调度?
如何以编程方式格式化FAT16的SD卡?
这是经典的死锁条件。 在完全读取StandardOutput之前,不应该调用WaitForExit 。
当输出被重定向时,进程在其所有StandardOutput流被读取之前不会终止。 因此,调用WaitForExit将等待启动的进程终止,并且子进程将等待父进程完全读取输出流,然后才能完成,从而导致死锁。
Msdn提供解释和代码示例以避免死锁。
同步读取 *** 作在StandardOutput流的调用者读取和写入该流的子进程之间引入依赖关系。 这些依赖关系可能会导致死锁情况。 当调用者从子进程的重定向流中读取时,它依赖于子进程。 调用者等待读取 *** 作,直到孩子写入流或关闭流。 当子进程写入足够的数据来填充重定向的流时,它依赖于父进程。 子进程等待下一个写 *** 作,直到父进程从完整流读取或关闭流。 当调用者和子进程相互等待以完成 *** 作时,会导致死锁情况,两者都不能继续。 您可以通过评估调用者和子进程之间的依赖关系来避免死锁。
// Start the child process. Process p = new Process(); // Redirect the output stream of the child process. p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.filename = "Write500lines.exe"; p.Start(); // Do not wait for the child process to exit before // reading to the end of its redirected stream. // p.WaitForExit(); // Read the output stream first and then wait. string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();
代码示例通过在p.WaitForExit之前调用p.StandardOutput.ReadToEnd来避免死锁情况。 如果父进程在p.StandardOutput.ReadToEnd之前调用p.WaitForExit并且子进程写入足够的文本来填充重定向的流,则可能会导致死锁情况。 父进程将无限期地等待子进程退出。 子进程将无限期等待父进程从完整的StandardOutput流中读取。
从标准输出和标准错误流中读取所有文本时,也有类似的问题。 例如,以下C#代码对两个流执行读取 *** 作。
// Do not perform a synchronous read to the end of both // redirected streams. // string output = p.StandardOutput.ReadToEnd(); // string error = p.StandardError.ReadToEnd(); // p.WaitForExit(); // Use asynchronousous read operations on at least one of the streams. p.BeginoutputReadline(); string error = p.StandardError.ReadToEnd(); p.WaitForExit();
上面几乎所有的东西都来自msdn,我建议你仔细阅读,以免进一步造成死锁。
总结以上是内存溢出为你收集整理的标准输出读取器挂起BCP工具全部内容,希望文章能够帮你解决标准输出读取器挂起BCP工具所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)