【发布时间】:2013-02-11 20:22:11
【问题描述】:
后台工作程序在被调用以将文本附加到闪烁控件时停止,这是部分代码。添加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())继续直到用户在表单上按下停止!
【问题讨论】:
-
启动后台worker的代码在哪里?是否阻塞了等待后台worker的线程?
-
它在按钮单击方法上调用,该方法写入 scintillaNET 配置文件,然后发出 bw.RunWorkerAsync();
-
没有异常,backgroundworker不加文字也不重复while循环就返回
-
UI 是冻结的,还是保持响应?
-
很可能是一个异常被抛出,而你只是没有捕捉到它。将 do work 处理程序包装在 try/catch 中,该程序在某处记录异常详细信息。例如,
scintilla1可能为空。
标签: c# multithreading user-interface backgroundworker scintilla