複数のスレッドを生成するアプリケーションがあります。そのうちの 1 つは、iPerf
ネットワークの信頼性を監視するために使用される実行可能ファイルを実行します。このプロセスは、ユーザーがウィンドウを閉じようとするまで無期限に実行されます。iPerf
ここで問題が発生します。サーバーがハングアップしないようにプロセスを正常にシャットダウンしようとしていますが、これが機能していないようです。コマンドプロンプトからコマンドを手動で実行して を押すと、問題なくシャットダウンできますCtrl+c
が、これはプログラムで簡単に実行できるようには見えません。
process.Kill();
or またはprocess.StandardInput.Close()
orを含む複数のことを試しprocess.StandardInput.WriteLine("\x3");
ましたが、これらのどれもプロセスに正常なシャットダウンメッセージを送信していないようです。process.Kill();
サーバーがハングするか、次回の起動に失敗します。他の 2 つのオプションは、サーバーをまったく停止しません。しかし、マニュアルctrl+c
は問題なく機能します。
ここに私のコードのスニペットがあります:
iperf_proc = new Process();
iperf_proc.StartInfo.FileName = Application.StartupPath + ".\\iperf3.exe";
String argumentStr = " -c " + test_data.host + " -t 0";
iperf_proc.StartInfo.Arguments = argumentStr;
iperf_proc.StartInfo.UseShellExecute = false;
iperf_proc.StartInfo.RedirectStandardOutput = true;
iperf_proc.StartInfo.RedirectStandardInput = true;
iperf_proc.StartInfo.RedirectStandardError = true;
iperf_proc.Start();
iperfRunning = true;
iperf_proc.BeginOutputReadLine();
iperf_proc.BeginErrorReadLine();
while (false == iperf_proc.HasExited)
{
if (true == processCancelled)
{
iperf_proc.StandardInput.Close(); // Doesn't Work!
iperf_proc.StandardInput.WriteLine("\x3"); // Doesn't Work!
iperf_proc.StandardInput.Flush(); // Doesn't Work!
}
}
iperf_proc.WaitForExit();
どんな助けでも大歓迎です。ありがとうございました!
アップデート:
コメントの Hans からの提案に基づいて、コードに何かを追加してctrl+c
イベントを送信しようとしました。
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GenerateConsoleCtrlEvent(uint dwCtrlEvent, uint dwProcessGroupId);
private enum CtrlEvents
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT = 1
}
private void closeBtn_Click(object sender, EventArgs e)
{
processCancelled = true;
//iperf_proc.CloseMainWindow();
bool succeeded = GenerateConsoleCtrlEvent((uint)CtrlEvents.CTRL_C_EVENT, (uint)iperf_proc.Id);
}
これはまったく機能しませんでした。プロセスはまだ実行中であり、追加された関数は false を返します。渡されたプロセスIDがタスクマネージャーのプロセスIDと一致することを確認しました。これで問題ありませんが、GenerateConsoleCtrlEvent 関数は false を返します。なぜこれが考えられるのでしょうか?