I am trying to read the output of a process in c# but I get this message "Cannot mix synchronous and asynchronous operation on process stream."

backgroundworker, c#, process

Solution

The problem is that you're using both synchronous and asynchronous output:

// Using async version here...
xcopy.BeginOutputReadLine();


StreamReader sr = xcopy.StandardOutput;

while (loop > 0)
{
    // Trying to use synchronous reading here
    progress = sr.ReadLine();

You need to design your algorithm to use one option or the other, but not both.

Problem

I am writing a backup program using xcopy and because there are a lot of large files it takes a while so I want to show the progress. When I try to use StreamReader to get the standard output, it has this error message when I debug. "Cannot mix synchronous and asynchronous operation on process stream." ``` public void backup_worker_DoWork(object sender, DoWorkEventArgs e) { int loop = 1; backup_worker.WorkerReportsProgress = true; Process xcopy = new Process(); ProcessStartInfo startinfo = new ProcessStartInfo(); startinfo.CreateNoWindow = true; startinfo.UseShellExecute = false; startinfo.RedirectStandardError = true; startinfo.RedirectStandardOutput = true; startinfo.FileName = Environment.CurrentDirectory + "\\xcopy.exe"; startinfo.Arguments = '"' + source + '"' + " " + '"' + target + '"' + " " + "/s /e /y"; xcopy.StartInfo.RedirectStandardOutput = true; xcopy.StartInfo = startinfo; xcopy.Start(); xcopy.BeginErrorReadLine(); xcopy.BeginOutputReadLine(); StreamReader sr = xcopy.StandardOutput; while (loop > 0) { progress = sr.ReadLine(); output_list.Items.Add(progress); } xcopy.OutputDataReceived += new DataReceivedEventHandler(backup_worker_OutputDataRecieved); xcopy.ErrorDataReceived += new DataReceivedEventHandler(backup_worker_ErrorDataReceived); xcopy.WaitForExit(); backup_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backup_worker_RunWorkerCompleted); } void backup_worker_ErrorDataReceived(object sender, DataReceivedEventArgs e) { } void backup_worker_OutputDataRecieved(object sender, DataReceivedEventArgs e) { } void backup_worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show("Completed"); } ``` Please help. Thanks in advance

Original source