Process.StandardOutput.ReadToEnd()卡死假象(非卡死)

这两天研究一个东西,利用C#做一个Oracle导出工具,利用到Process类,具体代码如下:

try
            {

                OracleHelper oracle = new OracleHelper(this.ConString);
                oracle.RunSQLToNonQuery(string.Format(@"CREATE OR REPLACE DIRECTORY DMPFILE AS 'D:\OracleData\OracleBack'"));
                DataTable dt = oracle.RunSQLToDataTable("select * from dba_directories WHERE DIRECTORY_NAME = 'DMPFILE'");
                if (dt == null || dt.Rows.Count <= 0)
                {
                    MessageBox.Show("未查询到虚拟目录数据,请检查;虚拟目录名称:DMPFILE");
                    return;
                }

                string users = this.GetUsers();

                if (users.IsNullOrEmptyOrZero())
                {
                    MessageBox.Show("请选择需要导出的用户。");
                    return;
                }

                Process p = new Process();
                p.StartInfo.FileName = "C:\\Windows\\system32\\cmd.exe";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                //p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
                p.StartInfo.CreateNoWindow = false;
                p.Start();

                p.StandardInput.WriteLine("md D:\\OracleData\\OracleBack;");
                string fileName = string.Format("GDBDC{0}", DateTime.Now.ToString("yyyyMMddHHss"));
                p.StandardInput.WriteLine(string.Format("expdp {0}/{1}@{2} schemas={3} dumpfile={4}.dmp DIRECTORY=DMPFILE logfile={4}.log&exit", this.txtUserName.Text, this.txtUserPwd.Text, this.txtOracleName.Text, users, fileName));

                string resultInfo = p.StandardOutput.ReadToEnd();
                string errorInfo = p.StandardError.ReadToEnd();
                LogOperation.WriteInfo("", resultInfo);
                LogOperation.WriteInfo("", errorInfo);
                p.WaitForExit();
                p.Close();
                MessageBox.Show("保存结果:D:\\OracleData\\OracleBack\\" + fileName);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

当执行到p.StandardOutput.ReadToEnd();时,一直处于卡死状态,整了一天都没找到原因,包括网上查找资料,利用多线程等等,一切都是徒劳的,最后无意间发现,实际不是卡死,而是操作为执行完,需要等待;真是整死人了;

总结:细心、耐心、要有创造想象力,问题不是那么复杂,只是你没有用心而已

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值