C# 线程间操作无效: 从不是创建控件的线程访问它--多线程操作

我们在用线程操作的时候,可能会出现异常:线程间操作无效: 从不是创建控件richTextBox1的线程访问它。因为windows窗体控件不是线程安全的,如果几个线程操作某一控件的状态,可能会使该控件的状态不一致,出现争用或死锁状态。这种情况有以下解决办法:

   利用委托机制实现线程安全。这种方法就是微软建议采用的跨线程调用的一种通用方法,就是使用代理来实现,就是将你所要操作的代码放到一个代理中,然后将这个代理交给创建这个控件的线程来执行你的代码。

private delegate void richTextBoxCallBack(); 

public void SetText(){

  richTextBoxCallBack callback = delegate()//使用委托
  { 
    richTextBox1.AppendText("test");
  };

   richTextBox1.Invoke(callback); 
}

 以上内容摘录:https://www.cnblogs.com/280850911/archive/2012/08/21/2648869.html


完整多线程代码

环境:

程序:WindowsForms(windows窗体)

FW版本:.NET Framework 4.5

C# 线程间操作无效: 从不是创建控件的线程访问它--多线程操作_第1张图片

完整源码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsAccess_Shift_MSServer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Task.Run(()=> {
                this.GetData();
            });
        }
        private delegate void richTextBoxCallBack();
        private void GetData() {

           
            for (int i = 0; i < 99; i++)
            {
                richTextBoxCallBack richTextBoxCallBack = delegate () {
                    SucceedRichTextBox.AppendText(i + "_行\n");
                };
                SucceedRichTextBox.Invoke(richTextBoxCallBack);
                Thread.Sleep(2000);
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}

你可能感兴趣的:(c#,c#,开发语言)