最近写代码发现有两种方法可以把子线程中的值切换的主窗体的控件上。
方法1:这个方法在资源里UDP发消息中有,特点是:子线程写在主窗体的的类里面
public partial class Form1 : Form
{
delegate void AppendStringCallback(string text);//创建委托 给窗体控件
AppendStringCallback appendStringCallback;
Thread receiveThread;// 线程
public Form1()
{
InitializeComponent();
appendStringCallback = new AppendStringCallback(AppendString);
}
private void AppendString(string text)//切换线程 到窗体线程给控件负值
{
if (richTextBox1.InvokeRequired)
{
richTextBox1.Invoke(appendStringCallback, text);
}
else
{
richTextBox1.AppendText(text + "\r\n");
}
}
private void Form1_Load(object sender, EventArgs e)
{
receiveThread = new Thread(new ThreadStart(ReceiveData));//启动 收信息的线程
//将线程设为后台运行
receiveThread.IsBackground = true;
receiveThread.Start();
}
private void ReceiveData()//接受消息
{
string str="";
while (true)
{
try
{
//----------------------------
这里是线程中要添加的东西
//----------------------------
AppendString(str);//把线程要传给控件的值传到控件里
}
catch(Exception ex)
{
//退出循环,结束线程
MessageBox.Show(ex.Message);
break;
}
}
}
}
方法2:在之前的博客“c#线程-线程间发消息-线程给窗体传值”中有过介绍,特点是子线程写在了单独的类中
线程类:
using System.Threading;
using System.Runtime.InteropServices//这个是用来引用dll的
namespace cmp
{
public delegate void CardReadHandler(string param);//建了个委托
public class CardReader
{
public Thread thread1 = new Thread(new ThreadStart(ReadKA));//线程
private static CardReadHandler onCardRead;//委托
public event CardReadHandler CardRead//一个事件
{
add { onCardRead += new CardReadHandler(value); }
remove { onCardRead -= new CardReadHandler(value); }
}
protected static void ReadKA()//线程处理函数
{
while (1 == 1)
{
string str="";
//----------------------------
这里是线程中要添加的东西
//----------------------------
onCardRead(str);//把要传到主窗体的值,从这里传走
}
}
}
}
在form窗体里:
namespace cmp
{
public partial class gjcmp : Form
{
private static string ka_id = "";
public gjcmp()
{
InitializeComponent();
//线程
CardReader cd = new CardReader();
cd.CardRead += this.OnCardRead;//这两行要写上去调上面线程的事件
}
//线程返回的卡id
private void OnCardRead(string param)//上面写的线程会不断给这个方法传值,所以操作写在这里
{
ka_id = param;//线程类传过来的值
object[] pList = { this, System.EventArgs.Empty };
label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);//这两行是还切换线程的,这样就可以给当前线程的控件传值了
}
//切换线程
private void UpdateUI(object o, System.EventArgs e)
{
label1.Text = ka_id;
}
}
}