Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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
C# foreach循环后台工作程序问题_C#_.net - Fatal编程技术网

C# foreach循环后台工作程序问题

C# foreach循环后台工作程序问题,c#,.net,C#,.net,我使用ffmpeg工具开发了一个用于视频音频合并的wpf程序。为此,我使用后台工作类。我将在这里包括我的代码 public VideoAudioMergeUserControl() { InitializeComponent(); bw.WorkerSupportsCancellation = true; bw.WorkerReportsProgress = true; bw.DoWork += new DoWork

我使用ffmpeg工具开发了一个用于视频音频合并的wpf程序。为此,我使用后台工作类。我将在这里包括我的代码

    public VideoAudioMergeUserControl()
    {
        InitializeComponent();
        bw.WorkerSupportsCancellation = true;
        bw.WorkerReportsProgress = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    }

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
       string progress= e.ProgressPercentage.ToString();
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        Process interactiveProcess = new Process();
        string processOutput = "";
        interactiveProcess.StartInfo.FileName = @"E:\ffmpeg.exe";
        interactiveProcess.StartInfo.UseShellExecute = false;
        interactiveProcess.StartInfo.CreateNoWindow = true;
        interactiveProcess.StartInfo.RedirectStandardInput = true;
        interactiveProcess.StartInfo.RedirectStandardError = true;

        ObservableCollection<VideoAudioCombined> videosAudios = (ObservableCollection<VideoAudioCombined>)e.Argument;
        foreach (VideoAudioCombined va in videosAudios)
        {

                string absoluteVideoPath = aviVideoPath + va.Video;
                string absoluteAudioPath = wavAudioPath + va.Audio;
                string relativeVideoPathSplit = va.Video.Substring(0, va.Video.Length - 4);
                string relativeAudioPathSplit = va.Audio.Substring(0, va.Audio.Length - 4);
                string outputavi = relativeVideoPathSplit + "_" + relativeAudioPathSplit + ".avi";
                string SelectedFileNameToSave = selectedFolder + outputavi;

                interactiveProcess.StartInfo.Arguments = "-i " + absoluteVideoPath + "  -i  " + absoluteAudioPath + "   -c:v copy -c:a aac -strict experimental " + SelectedFileNameToSave + " ";
                interactiveProcess.Start();
                interactiveProcess.EnableRaisingEvents = true;

                interactiveProcess.ErrorDataReceived += new DataReceivedEventHandler((process, outputEventArgs) => processOutput += outputEventArgs.Data);
                interactiveProcess.BeginErrorReadLine();
                bw.ReportProgress(100);

        }
    }



private void ButtonMerge_Click(object sender, RoutedEventArgs e)

        {
            System.Windows.Forms.FolderBrowserDialog folderDlg = new System.Windows.Forms.FolderBrowserDialog();
            folderDlg.ShowNewFolderButton = true;
            folderDlg.Description = Properties.Resources.MSG_Select_Folder_Merge_Audio_Video;

            // Show the FolderBrowserDialog.
            System.Windows.Forms.DialogResult result = folderDlg.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                selectedFolder = folderDlg.SelectedPath+"\\";

            }
            bw.RunWorkerAsync(VideoAudioCollection);         
        }
公共VideoAudioMergeUserControl()
{
初始化组件();
bw.workersupport扫描单元=真;
bw.WorkerReportsProgress=true;
bw.DoWork+=新DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bw\u RunWorkerCompleted);
bw.ProgressChanged+=新的ProgressChangedEventHandler(bw\U ProgressChanged);
}
void bw_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
字符串进度=e.ProgressPercentage.ToString();
}
void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
进程交互进程=新进程();
字符串processOutput=“”;
interactiveProcess.StartInfo.FileName=@“E:\ffmpeg.exe”;
interactiveProcess.StartInfo.UseShellExecute=false;
interactiveProcess.StartInfo.CreateNoWindow=true;
interactiveProcess.StartInfo.RedirectStandardInput=true;
interactiveProcess.StartInfo.RedirectStandardError=true;
ObservableCollection videosAudios=(ObservableCollection)e.参数;
foreach(视频音频和视频音频)
{
字符串absoluteVideoPath=AvVideoPath+va.Video;
字符串绝对音频路径=wavAudioPath+va.音频;
string relativeVideoPathSplit=va.Video.Substring(0,va.Video.Length-4);
string RelativeeAudioPathSplit=va.Audio.Substring(0,va.Audio.Length-4);
字符串outputavi=relativeVideoPathSplit+““+relativeAudioPathSplit+”.avi”;
string SelectedFileNameToSave=selectedFolder+outputavi;
interactiveProcess.StartInfo.Arguments=“-i”+绝对视频路径+“-i”+绝对音频路径+”-c:v拷贝-c:a aac-严格实验性“+选择的文件名保存+”;
interactiveProcess.Start();
interactiveProcess.EnableRaisingEvents=true;
interactiveProcess.ErrorDataReceived+=新的DataReceivedEventHandler((进程,outputEventArgs)=>processOutput+=outputEventArgs.Data);
interactiveProcess.BeginErrorReadLine();
bw.报告进展情况(100);
}
}
私有无效按钮合并单击(对象发送者,路由目标)
{
System.Windows.Forms.FolderBrowserDialog folderDlg=新建System.Windows.Forms.FolderBrowserDialog();
folderDlg.ShowNewFolderButton=true;
folderDlg.Description=Properties.Resources.MSG\选择\文件夹\合并\音频\视频;
//显示FolderBrowser对话框。
System.Windows.Forms.DialogResult=folderDlg.ShowDialog();
if(result==System.Windows.Forms.DialogResult.OK)
{
selectedFolder=folderDlg.SelectedPath+“\\”;
}
RunWorkerAsync(视频音频采集);
}

循环的第一次迭代不会产生任何问题。第二次迭代带来以下问题-“流上已启动异步读取操作。”请提供帮助。

在启动后台工作程序之前,请确保
IsBusy
为false:

if (!bw.IsBusy) 
{
    bw.RunWorkerAsync(VideoAudioCollection);
}
如果IsBusy为true,则表示backgroundworker仍在工作,尚未完成其功能。在这种情况下,它将抛出一个异常。如果发生这种情况,您可以显示一个消息框,说明
“合并操作仍在进行中,请等待该操作完成”

您还可以尝试取消当前正在运行的调用操作

bw.CancelAsync();

错误的原因是以下行:
interactiveProcess.BeginErrorReadLine()

您不必在foreach循环中使用单个进程调用该方法

在第一次迭代中,您启动了异步读取操作并继续进行。实际上,在下一次迭代中,这个操作已经开始了。 根据文件:

异步读取操作启动时,将调用事件处理程序 每次关联进程将一行文本写入其 标准错误流

您必须检查逻辑才能启动流程。我认为您应该为循环的每个迭代启动不同的流程,因为对于每个迭代,您使用的是具有不同参数的相同流程,但是相同的
StandardError


有关该方法的详细信息。

启动后台工作程序的代码部分在哪里?我包括了调用后台工作程序的代码。错误的原因是行“interactiveProcess.BeginErrorReadLine();”。您不必在foreach循环中使用单个进程调用该方法。在第一次迭代中,您启动了异步读取操作并继续,但在下一次迭代中,此操作已经启动。你必须回顾逻辑才能开始这个过程。嗨,我需要这个逻辑。在每次迭代中都有可能出错,因为每次迭代中文件名都是diffrenet。因此,我需要保存每次迭代中的错误(如果有)。请help@user1665130作为建议,接受其他用户的答案。如果您这样做,SO用户将更乐意帮助您。我刚才说了错误在哪里以及如何解决问题:“应该为循环的每个迭代启动不同的过程”。