多线程中处理信息显示问题-高分
有个技术问题请教一下,看你有没有更好的看法?
我这个需求是这样的:
我现在做的是自动化生产线,有一个网络打印监控程序,我需要接收到打印信息后打印出来,并在界面上显示打印列表,比如BOX001,BOX002打印后都有个记录显示,再来一个BOX003也追加进这个列表中.
接收到有client提交打印请求,启动一个线程处理,但是我要在线程中是不能够给UI控件赋值的,我们暂时保存在一个List中,用Timer定时取出显示,但这种方法感觉比较笨的做法。
TcpClient tcpClient = this.tcpListener.AcceptTcpClient();
System.Threading.Thread clientThread = new System.Threading.Thread(new ParameterizedThreadStart(HandleClientRequest));
clientThread.Start(tcpClient);
我本来想在这个方法(HandleClientRequest)中显示打印信息内容,但是在一线程中,无法处理。
最后我想到写入一个临时文件,FileSystemWatcher去解决,这方法应该会更好些.
老大还什么更好的方法吗?
------解决方案--------------------
C# code
public Delegate void Handle(string cartonNo);
UIControlObj.Invoke((Handle)(cartonNo)=>{UIControlObj.Text=cartonNo;});
------解决方案--------------------
------解决方案--------------------
楼主是想问不同线程之间的传值问题吗?如果是的话可以这样
private void button11_Click(object sender, EventArgs e)
{
Thread thr = new Thread(new ParameterizedThreadStart(Test));
thr.IsBackground = true;
IList<string> list = new List<string>();
list.Add("a");
list.Add("b");
thr.Start(list);
}
private void Test(object obj)
{
IList<string> list = (IList<string>)obj;
}
/////////////////////////////////////////////////////////
如果要实现访问主线程的UI控件可以这样。
在主线程窗体Load方法中加一句代码
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
}
private void button11_Click(object sender, EventArgs e)
{
Thread thr = new Thread(new ParameterizedThreadStart(Test));
thr.IsBackground = true;
IList<string> list = new List<string>();
list.Add("a");
list.Add("b");
thr.Start(list);
}
private void Test(object obj)
{
try
{
IList<string> list = (IList<string>)obj;
this.button11.Text = "123";
}
catch (Exception err)
{
throw new Exception(err.Message);
}
}
当然还可以用委托