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

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

在使用FFmpeg和VLC进行视频处理和播放时,通常会有这样的需求:利用FFmpeg处理视频文件,并将处理后的视频流发送给VLC播放器进行播放。`ffmpeg.StandardOutput.BaseStream` 代表了FFmpeg处理输出的视频流基础数据流。要将这个流写入VLC播放器的 `play` 方法,需要先将 `BaseStream` 转换为VLC能够接受的格式或通过某种方式将数据传输给VLC。 实际上,VLC播放器的 `play` 方法并不直接接受一个数据流作为参数,它通常需要一个媒体对象或文件路径等信息。因此,将 `ffmpeg.StandardOutput.BaseStream` 写入VLC的 `play` 方法,需要通过间接的方式实现。以下是一种可能的方法: 1. 使用内存缓冲区:将FFmpeg输出的数据流先写入内存缓冲区中,然后通过某种方式让VLC从内存中读取数据。这需要自定义VLC的媒体源来读取内存缓冲区的数据。 2. 使用文件中转:将 `ffmpeg.StandardOutput.BaseStream` 中的数据直接写入一个临时文件,然后使用VLC的 `play` 方法播放这个临时文件。 下面是使用内存缓冲区的一个简单的概念性示例: ```csharp // 假设这是FFmpeg的输出流 var ffmpegStream = ffmpeg.StandardOutput.BaseStream; // 创建一个内存流作为缓冲区 using (var memoryStream = new MemoryStream()) { ffmpegStream.CopyTo(memoryStream); // 将FFmpeg输出的流复制到内存流中 memoryStream.Position = 0; // 设置内存流的当前位置到流的开始 // 现在使用VLC播放这个内存流,具体实现取决于VLC的API // 这里只是示意,需要根据实际情况实现如何从内存流中读取数据来播放 vlcControl.Play(memoryStream); } ``` 请注意,具体实现细节会根据使用的FFmpeg和VLC库的API有所差异。此外,VLC的libvlc库可能需要额外的设置来从文件的媒体源中读取数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值