本文介绍: 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
完整源码:
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)
{
}
}
}
原文地址:https://blog.csdn.net/cplvfx/article/details/135594915
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_57316.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。