C# winform在线程中给控件赋值确定要报错,这要是打印日志什么的就很烦,好在用代理就可以解决这个问题
public delegate void AppendStringCallback(string text);
public static event AppendStringCallback appendStringCtrl;
public delegate void AppendObjectCallback(object[] obj);
public static event AppendObjectCallback appendObjectCtrl;
private void Form1_Load(object sender, EventArgs e)
{
Connect();
label1.Text = strOpen;
appendStringCtrl = new AppendStringCallback(AppendString);
appendObjectCtrl = new AppendObjectCallback(AppendObject);
}
//绑定数据
private void BandData(string curTime, string mobile, string res)
{
if (dgvCount == 1000)
{
dgvCount = 1;
dgv.Rows.Clear();
}
object[] obj = new object[4];
obj[0] = dgvCount;
obj[1] = curTime;
obj[2] = mobile;
obj[3] = res;
//if (res == "1")
// obj[3] = "成功";
//else
// obj[3] = "失败";
//dgv.Rows.Add(obj);
appendObjectCtrl(obj);
dgvCount++;
}
private void AppendString(string text)
{
if (this.rtxtMes.InvokeRequired)
{
this.rtxtMes.BeginInvoke(new AppendStringCallback(AppendString), new object[] { text });
}
else
{
SetMessage(text);
}
}
private void AppendObject(object[] obj)
{
if (this.dgv.InvokeRequired)
{
this.dgv.BeginInvoke(new AppendObjectCallback(AppendObject), new object[] { obj });
}
else
{
dgv.Rows.Add(obj);
}
}
这要调用就没有什么问题了
private void button1_Click(object sender, EventArgs e)
{
Thread objThread = new Thread(new ThreadStart(delegate
{
BandData(DateTime.Now.ToString(), "152019666666", "哈哈");
appendStringCtrl("sefsef");
}));
objThread.Start();
}