シンティラ コントロールにテキストを追加するために呼び出されると、バックグラウンド ワーカーが停止します。部分的なコードを次に示します。try catch ロジックを追加した後も、例外は発生しませんでした。
private delegate void DWrite(string text);
private void Write(string text)
{
try
{
scintilla1.AppendText(text);
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
string x;
while (true)
{
x = tcw.Read();
// MessageBox.Show(x);
Thread.Sleep(100);
try
{
scintilla1.Invoke(new DWrite(Write), x);
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
// scintilla1.Update();
}
このロジックを追加しました:
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception)args.ExceptionObject;
MessageBox.Show("MyHandler caught : " + e.Message);
}
public void doworkstuff()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
try
{
for (int i = 0; i < 5; i++)
scintilla1.Invoke(new DWrite(Write), tcw.Read());
}
catch (Exception ex)
{ MessageBox.Show(ex.ToString()); }
}
問題は、デッドロックを回避するために外部スレッドがアクセスできないようにすること自体の制御にあるようです。BGWorker を使用せずに同じ機能を得る方法はありますか? tcw.read() は、コントロールへの入力をストリーミングする telnet クライアントです。ユーザーがフォームの停止を押すまで、ストリーミング (つまり tcw.read()) を続行したいのです!