※環境 Win764Bit, .NetFramework4.0 or 4.5

本来DOSプロンプトで動作する対話型プログラム、例えばMySQL.exeなどをにコマンドを送り、その表示結果を取得するウィンドウズフォームアプリケーションを作成しています。

動作イメージは添付の画像のような感じで、テキストボックスにコマンドを入力し、送信ボタンを押すことを繰り返す事で作業を進めます。

※入力されているテキストはイメージです。
アプリケーションイメージ

これを実現するために以前質問した内容(ウィンドウズフォームアプリケーションから対話型コンソールアプリケーションを操作するには?)を踏まえて作成してみたのですが上手く行きません。

主な処理概要として、

1.フォームをロードするタイミング(Loadイベント)でSystem.Diagnostics.Processで対象となるコンソールアプリケーション(mysql.exe)のプロセスを立ち上げ、プロセス自体はフォームの変数へ保持しておく。

2.送信ボタンを押すとフォームに保持してあるプロセスに対してStandardInp‌​ut.WriteLineStandardOutput.ReadLineで入出力を行いその結果を結果領域に表示します。

この時StandardInp‌​ut.WriteLineでコマンドを送出した瞬間にプロセスが終了していまい、結果を受け取ることは可能なのですがその後の操作が継続して行う事が出来ません。

プロセスが終了しなければ良いと思いWaitForExitを試してみましたが同期待機なので画面がフリーズして使えませんでした。

非同期で待機が可能なProcess.Exitedも試しましたがStandardInp‌​ut.WriteLine処理でプロセスが終了してしまう事には変わりがありませんでした。

なんとかプロセスが終了せず継続してコンソールアプリケーションと対話を続ける方法はないものでしょうか?

なるべく.NETでの実現を望んでいますがインターフェイスだけ.NETであればいいので他の言語などでの実現方式もあればヒントを頂ければ嬉しいです。

前回@pgrho様に丁寧に教えて頂いたのですが当方の理解が足りず再度の質問となります。

皆様のお力添えを頂ければと思います。

なにとぞよろしくお願いします。

以下検証中のプログラムコードです。

Imports System.Diagnostics
Public Class Form1

    Private p As New Process

    Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
        'プロセスが終了したときに実行される
        MessageBox.Show("終了しました。")
    End Sub
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        '起動するファイルを指定する
        Dim command As String = "C:\xampp\mysql\bin\mysql.exe"

        p.StartInfo.FileName = command
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardInput = True
        p.StartInfo.RedirectStandardOutput = True
        p.StartInfo.RedirectStandardError = True
        p.SynchronizingObject = Me

        AddHandler p.Exited, New EventHandler(AddressOf p_Exited)
        p.EnableRaisingEvents = True
        p.Start()


    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        p.StandardInput.WriteLine("show databases;" + "\r\n")
        Dim output As String = p.StandardOutput.Read()
        Dim errorStrings As String = p.StandardError.Read()
        MsgBox(output + errorStrings)
    End Sub
End Class

○プロセス終了
画像の説明をここに入力