Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用闪烁网络不冻结GUI时,在backgroundworker线程中暂停_C#_Multithreading_User Interface_Backgroundworker_Scintilla - Fatal编程技术网

C# 使用闪烁网络不冻结GUI时,在backgroundworker线程中暂停

C# 使用闪烁网络不冻结GUI时,在backgroundworker线程中暂停,c#,multithreading,user-interface,backgroundworker,scintilla,C#,Multithreading,User Interface,Backgroundworker,Scintilla,调用后台工作程序以将文本附加到闪烁控件时会停止,下面是部分代码。添加try-catch逻辑后,我仍然没有得到任何异常 private delegate void DWrite(string text); private void Write(string text) { try { scintilla1.AppendText(text); } catch (Exception ex) { M

调用后台工作程序以将文本附加到闪烁控件时会停止,下面是部分代码。添加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()); }
    }
静态void MyHandler(对象发送方,未处理的ExceptionEventArgs参数)
{
异常e=(异常)args.ExceptionObject;
Show(“MyHandler捕获:”+e.Message);
}
公共物品
{
AppDomain currentDomain=AppDomain.currentDomain;
currentDomain.UnhandledException+=新的UnhandledExceptionEventHandler(MyHandler);
尝试
{
对于(int i=0;i<5;i++)
调用(新的DWrite(Write),tcw.Read());
}
捕获(例外情况除外)
{MessageBox.Show(例如ToString());}
}
问题似乎在于控件本身,不允许外部线程访问以避免死锁。有没有一种方法可以在不使用BGWorker的情况下获得相同的功能?
tcw.read()是一个telnet客户端,它将输入流式传输到控件,我希望流式传输(即tcw.read())继续,直到用户在表单上按stop

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

scintilla1.BeginInvoke(new DWrite(Write), x);

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

scintilla1.BeginInvoke(new DWrite(Write), x);

你在闪烁网中发现了一个bug

为了处理托管闪烁体包装器和本机闪烁体控件之间的互操作,闪烁体网覆盖WndProc方法。在这样做时,用于封送调用回UI线程的Windows窗体机制似乎已被破坏

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

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


(完全披露:我是闪烁网的开发者)

你在闪烁网中发现了一个bug

为了处理托管闪烁体包装器和本机闪烁体控件之间的互操作,闪烁体网覆盖WndProc方法。在这样做时,用于封送调用回UI线程的Windows窗体机制似乎已被破坏

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

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



(完全公开:我是闪烁网开发人员)

启动后台工作程序的代码在哪里?它是否阻塞了等待后台工作线程的线程?它在一个按钮单击方法上被调用,该方法写入闪烁网配置文件,然后发出bw.RunWorkerAsync();没有异常,backgroundworker返回时不添加文本,也不在页面上重复,而UI是否冻结,或者它是否保持响应?很可能抛出异常,而您只是没有捕获它。将do work处理程序包装在一个try/catch中,将异常详细信息记录在某处。例如,
scatinlla1
可能为空。启动后台工作程序的代码在哪里?它是否阻塞了等待后台工作线程的线程?它在一个按钮单击方法上被调用,该方法写入闪烁网配置文件,然后发出bw.RunWorkerAsync();没有异常,backgroundworker返回时不添加文本,也不在页面上重复,而UI是否冻结,或者它是否保持响应?很可能抛出异常,而您只是没有捕获它。将do work处理程序包装在一个try/catch中,将异常详细信息记录在某处。例如,
scatinlla1
可能为空。不,我试图这样循环,看看这是否是导致问题的原因;int=0;虽然(iDid您是否尝试在不使用while循环的情况下简单地调用该方法?不,使用BeginInvoke时,不会有相同的行为!您可以尝试在RunWorkerCompleted事件中更新UI,该事件在UI线程上触发。但是我不确定您是否需要这样做。不,我尝试这样循环,以查看这是否是导致问题的原因;int=0;while(iDid)您是否尝试在不使用while循环的情况下简单地调用该方法?没有时间,使用BeginInvoke,同样的行为!您可以尝试在RunWorkerCompleted事件中更新UI,该事件在UI线程上触发。但是我不确定这是否是您需要的。