processo de captura stdout e stderr na ordem correta

Eu inicio um processo do C # da seguinte maneira:

public bool Execute()
{
    ProcessStartInfo startInfo = new ProcessStartInfo();

    startInfo.Arguments =  "the command";
    startInfo.FileName = "C:\\MyApp.exe";

    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;

    Log.LogMessage("{0} {1}", startInfo.FileName, startInfo.Arguments);

    using (Process myProcess = Process.Start(startInfo))
    {
        StringBuilder output = new StringBuilder();
        myProcess.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
        {
            Log.LogMessage(Thread.CurrentThread.ManagedThreadId.ToString() + e.Data);
        };
        myProcess.ErrorDataReceived += delegate(object sender, DataReceivedEventArgs e)
        {
            Log.LogError(Thread.CurrentThread.ManagedThreadId.ToString() +  " " + e.Data);            
        };

        myProcess.BeginErrorReadLine();
        myProcess.BeginOutputReadLine();

        myProcess.WaitForExit();

    }

    return false;
}

Mas isso tem um problema ... se o aplicativo em questão escreve para std out e std err nessa ordem:

std out: msg 1
std err: msg 2
std out: msg 3

Então a saída que vejo dos logs é:

msg 2
msg 1
msg 3

Isso parece ser porque os manipuladores de eventos são executados em outro thread. Então, minha pergunta é como a ordem do processo para escrever erradamente e ser mantida?

Pensei em usar um registro de data e hora, mas acho que isso não funcionará devido à natureza preventiva dos threads.

Atualização: Confirmado que usar um registro de data e hora nos dados não é útil.

Atualização final: A resposta aceita resolve esse problema - no entanto, ela tem uma desvantagem, quando os fluxos são mesclados, não há como saber para qual fluxo foi gravado. Portanto, se você precisar da lógica de gravação para stderr == falha, em vez do código de saída do aplicativo, talvez ainda esteja estragado.

questionAnswers(2)

yourAnswerToTheQuestion