それがこの同類を探しますので、私は、コンソールモードでmariadbを起動するバッチスクリプトを持っている:C#が新しいウィンドウなしでバッチスクリプトを実行して、リッチテキストボックスに、すべての(標準/エラー)出力をリダイレクト
ランC#のWinFormアプリを使用mariadb.bat
@echo off
cd /D mariadb-10.1.14-win32\bin && mysqld.exe --console
@pause
は、私はこのバッチスクリプトを起動して、リッチテキストボックスに、すべての出力を取得したいのですが。
これは私がこれまでしているコードです:
// Configure db server process
Process dbServer = new Process();
dbServer.StartInfo.FileName = "cmd";
dbServer.StartInfo.Arguments = "/c start /wait run-mariadb.bat";
dbServer.StartInfo.CreateNoWindow = true;
dbServer.StartInfo.UseShellExecute = false;
dbServer.StartInfo.RedirectStandardOutput = true;
dbServer.StartInfo.RedirectStandardError = true;
dbServer.OutputDataReceived += new DataReceivedEventHandler(HandleDBServerOutput);
dbServer.ErrorDataReceived += new DataReceivedEventHandler(HandleDBServerOutput);
これらは私のヘルパーメソッドです:
string FormatOutput(string message)
{
return string.Format("[ {0} ] : {1}",
DateTime.Now.ToShortTimeString(),
message);
}
void HandleDBServerOutput(object sender, DataReceivedEventArgs e)
{
this.BeginInvoke(new MethodInvoker(() =>
{
if (!string.IsNullOrEmpty(e.Data))
dbLogsRTB.AppendText(FormatOutput(e.Data));
}));
}
私はこのようなプロセスを開始します。
// Start database server
dbServer.Start();
dbServer.BeginOutputReadLine();
dbServer.WaitForExit();
上記新しいコマンドプロンプトウィンドウが作成され、そこにmariadbが実行されています。 dbServer.StartInfo.CreateNoWindow = true;
が無視される理由は何ですか?
ありがとう、それは私の以前の削除されたコメントを無視して、トリックを行ったようです。今、打ち上げは機能していますが、出力が得られませんが、実際にmariadbサーバーが稼働していることがわかります(私はそれに接続できます)。もう1つ、アプリ全体のUIが凍結しているようですが、それはwaitforexitの行のためですか?私は、隠しコンソールでサーバーを実行し、自分のRTBに出力をリダイレクトしようとしていますが、どうすればこの問題を解決できますか? – Latheesan
はい、これをGUIスレッドで実行すると、GUIスレッドはロックされ、 'WaitForExit'行は完了を待ちます。あなたのフォームにdbServerへの参照を保持し、時々、 'HasExited'をチェックするか、' Exited'イベントにサインすることができます。 –
「EnableRaisingEvents」を有効にする必要があるのですか? – Latheesan