0

后台工作人员在被调用以将文本附加到闪烁控件时停止,这是部分代码。添加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())继续直到用户在表单上按下停止!

4

2 回答 2

3

您在 ScintillaNET 中发现了一个错误。

为了处理托管 Scintilla 包装器和本机 Scintilla 控件之间的互操作,ScintillaNET 重写了 WndProc 方法。这样一来,用于封送回 UI 线程的调用的 Windows 窗体机制似乎已被破坏。

同时,您可以使用BackgroundWorker.ProgressChanged事件来精确地执行您正在尝试的定期 UI 更新类型。

确保已将 BackgroundWorker.WorkerReportsProgress 属性设置为 后true,修改代码以便使用BackgroundWorker.ReportProgress方法代替 Invoke 方法并处理 ProgressChanged 事件。

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    string x;
    while (true)
    {
        x = "Your telnet data";
        Thread.Sleep(100);
        worker.ReportProgress(-1, x);
    }
}

private void bg_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    string text = e.UserState as string;
    scintilla1.AppendText(text);
}

(全面披露:我是一名 ScintillaNET 开发人员)

于 2013-02-14T21:42:06.597 回答
0

你应该设置一些中断条件,你的 while 循环是一个无限循环!如果您使用 BeginInvoke 而不是 Invoke,后台工作人员不会停止!

scintilla1.BeginInvoke(new DWrite(Write), x);
于 2013-02-11T20:51:21.827 回答