C#跨线程操作,传递很多数据给一个用户控件,然后用户控件显示数据。
我的解答如下:
利用委托传递参数的方法来将你的参数传递过去到UI线程,因为你用K串口读取的线程不是在UI线程中,所以需要用委托来将的你的参数传递过去
如:Invoke(new UpdateListview(UpdateListviewMethod), new object[] { e.SrcNum, e.PortData });
如果你有很多参数,你也可以自已将参数做成 new object[] { e.SrcNum, e.PortData }传递,或者将所以参数做成一个类来当成一个参数传递也可以
我大概知道这么做,就是不知道怎么写,就把一个byte类型的数组传递到UI,麻烦你帮我写个简单的例子行吗?谢谢了。
private delegate void DGUpdateUI(byte[] aryByte);//声明一个委托,空返回,带一个byte数组的参数
private void button4_Click(object sender, EventArgs e)
{
//此处我自己启动一个新建的线程来模拟不是主线程
Thread threadTest = new Thread(new ThreadStart(ThreadTestMethod));
threadTest.Start();//线程启动
}
private void ThreadTestMethod()
{
Thread.Sleep(1000);
byte[] aryByte = new byte[10];
for (int i = 0; i < 10; i++)
{
aryByte[i] = (byte)(i * 2 + 3);
}
DGUpdateUI dgUI = new DGUpdateUI(UI);//定义一个委托
//this.Invoke(dgUI, aryByte);//这个也是可以的,只不过此处只传一个参数
this.Invoke(dgUI, new object[] { aryByte });//这个也是可以的,只不过可以传递N个参数
}
// 这个函数就可以从别的线程中得到数据,且将其显示到listbox中去
private void UI(byte[] aryByte)
{
foreach (byte b in aryByte)
{
this.listBox1.Items.Add(b);
}
}
大致是这样的,我从串口读回来的数据,按顺序把有用的数据保存到用户控件的一个byte数组alldata[255]中,然后我要把这个数组中的数据组合好并显示到用户控件指定的文本框里。比如:
Ua = (alldata[10] * 256 + alldata[11]) / 100;
textBoxUa.Text = Ua.ToString();
很多个这样的数一起刷新该如何用delegate实现显示呢?
希望你写个测试用例来,串口数据可以用timer模拟一些。没有测试方法就没法给你解决。
2014-09-15
虽然不是我要的,还是谢谢你回答。