Windowsフォームプロジェクトでは、編集用にメモ帳にファイルを開くボタン用のハンドラがあります。メモ帳が閉じられると、私は関数RefreshTextBox()
を呼び出してテキストファイルを解析し、値に基づいてTextBoxを更新します。ここではメモ帳を開き、その閉じた後にリフレッシュメソッドを呼び出す方法は次のとおりです。このコードはどのように別のスレッドで実行されていますか?
private void button_Click(object sender, EventArgs e)
{
Process p = new Process
{
EnableRaisingEvents = true,
StartInfo =
{
FileName = "NOTEPAD.EXE",
Arguments = _path,
WindowStyle = ProcessWindowStyle.Maximized,
CreateNoWindow = false
}
};
p.Exited += (a, b) =>
{
RefreshTextBox();
p.Dispose();
};
p.Start();
}
とテキストボックスを更新するためのコード:
private void RefreshTextBox()
{
using (StreamReader reader = File.OpenText(_appSettingsPath))
{
string text = reader.ReadToEnd();
// Code to parse text looking for value...
// InvalidOperationException thrown here:
textBox.Text = reader.Value.ToString();
}
}
これは、スレッドからコントロールを更新しようとしているため、例外がスローされますそれが作成されたものを除いて。私はなぜ理解しているのか分かりません。私はこれを新しい仕事や背景職人などでやっていません。明らかにメモ帳は別のスレッドで実行されていますが、リフレッシュメソッドはプロセスが終了するまで呼び出されません。
編集:Visual Studio(管理者用)でデバッグするときに、このエラーが致命的な例外ポップアップをスローすることを追加する必要があります。アプリケーションが単独で実行されているときにポップアップが表示されない場合は、例外が黙って飲み込まれたり、それが発生したりしません。ドキュメントを1として
'Exited'イベントは別のスレッドで発生している可能性があります。これはおそらく多くの場合、決して見られません。 (Windows Formsスレッドのような「アイドリング」がないコンソールアプリケーションを想像してみてください) –
問題を解決するのに役立つ別のスレッドからUIを更新する方法についての記事です。 https://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c –