私は一般的にC#とGUI開発に不慣れです。これが古い質問である場合は、その情報源に私を誘導してください。この質問を削除します。
私の状況:つまり、1つの関数のコンソール出力をWindowsアプリケーションフォームのテキストボックスにリダイレクトするGUIを作成しています。コンソール出力には、デバイスのシリアル番号、現在のソフトウェアバージョンなどの情報がユーザーに表示されるだけです。
私の問題:このフォームはうまく機能しますが、ソフトウェアの更新プロセスに数分かかり、フォームが完了するまでフォームがフリーズします。今、私はバックグラウンドワーカーを実装することでこの問題が軽減されることを知っています。ただし、バックグラウンドワーカーを実装すると、次のエラーが発生します。
クロススレッド操作が無効です:コントロール'TextBox'は、それが作成されたスレッド以外のスレッドからアクセスされました。
私のコードの要約は次のとおりです。
public class Form1 : Form
{
this.backgroundWorker1.DoWork += new
System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
BigProcess(bw);
}
private void BigProcess(BackgroundWorker bw)
{
// lengthy operation that includes lots of
Console.WriteLine("feedback stuff for the user");
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
}
このプロジェクトには、コンソール出力のリダイレクトを処理TextBoxStreamWriter
する派生クラスもあります。私はメソッドとメソッドをオーバーライドしてStringWriter
います。TextBoxStreamWriter
WriteLine
Write
これが私がしていることの例です:
public override void WriteLine(string value)
{
base.WriteLine(DateTime.Now.ToString(value));
textBoxOutput.AppendText(value.ToString() + Environment.NewLine);
writer.Write(value);
}
このメソッドが呼び出されると、InvalidOperationExceptionがスローされます。
どうすればこれをスレッドセーフにすることができますか?どんな助けでもいただければ幸いです。