c# - 从另一个线程附加到文本框

标签 c# multithreading winforms invoke

我有一个包含许多选项卡的表单,我想从多个线程同时写入它们 (UI BackGroundWorker 等) 我已经编写了这段代码,它正在主选项卡上运行(应用程序启动时可见的选项卡)

    public struct Struct_Append
    {
        public RichTextBox Screen;
        public string Message;
        public Color Color;
    }

    public void AppendAllTextAllScreen (Struct_Append append  )
    {
        RichTextBox screenToPrint = append.Screen;
        Font font = new Font("Tahoma", 8, FontStyle.Regular);
        if (screenToPrint.InvokeRequired) //&& this.Visible)
        {

            append.Message = append.Message + "\n";
            try
            {
                this.Invoke(new Action<Struct_Append>(AppendAllTextAllScreen), new object[] { 
                append });
            }
            catch(Exception ex)
            {
                //handle exception
            }
             return; 
        }
        append.Message = append.Message + "\n";

        screenToPrint.SelectionFont = font;
        screenToPrint.SelectionColor = append.Color;
        screenToPrint.AppendText(append.Message);
    }

它可以在任何线程中工作,但是一旦我将屏幕设置为其他一些选项卡,然后启动它

        Struct_Append structAppend1 = new Struct_Append();
        structAppend1.Screen = scrnSta1;
        structAppend1.Color = Color.Bisque;
        structAppend1.Message = "THIS IS A TEST";
        AppendAllTextAllScreen(structAppend1);

VisualStudio2013 卡住并自行重新启动!!!

但是当我在没有调试的情况下运行它时,它运行良好

编辑我使用的产生错误的代码

这是我用来测试上面的appendText方法

private async void DoSomthing()
{
            Task.Run(() =>
            {
                _Append structAppend1 = new _Append();
                structAppend1.Screen = ScrnSta1; ;
                structAppend1.Color = Color.Bisque;
                structAppend1.Message = "THIS IS A TEST";
                for (int i = 0; i < 5; i++)
                {
                    AppendAllTextAllScreen(structAppend1);
                }


            });
            Task.Run(() =>
            {
                _Append structAppend = new _Append();
                structAppend.Color = Color.Aquamarine;
                structAppend.Message = "THIS IS A TEST";
                structAppend.Screen = ScrnSta2;
                for (int j = 0; j < 5; j++)
                {
                    AppendAllTextAllScreen(structAppend);
                }
            });
}

scrnsta1/2 是我的 Form (主 UI 线程)中的两个独立选项卡,我从那里调用此方法(UI 线程)

我在这里缺少什么?

最佳答案

据我了解,从不同线程访问 Windows 窗体控件必须通过 Invoke method 来完成。 Control,它需要定义合适的委托(delegate)。在您的示例中,这些委托(delegate)基本上是在 DoSometing 实现中使用的 lambda 表达式。

关于c# - 从另一个线程附加到文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23732627/

相关文章:

c# - 验证 C# WinForms 代码在 Visual Studio 2008 中工作的正确方法是什么?

.net - Windows 窗体 : SelectionChanged event for TextBox class

c# - 关闭 WPF MVVM 中的窗口

c# - 多线程时将参数传递给方法

java - getClass().getName() 返回 null

.net - 关于线程同步的一些问题

c# - XML 序列化异常

c# - 如何在构造后修改值类型中的只读字段

c# - DataContract 不使用属性中指定的名称属性

c# - 在 C#/.Net 中缓存