日期:2014-05-17  浏览次数:20898 次

多线程中处理信息显示问题-高分
有个技术问题请教一下,看你有没有更好的看法?
我这个需求是这样的:
我现在做的是自动化生产线,有一个网络打印监控程序,我需要接收到打印信息后打印出来,并在界面上显示打印列表,比如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;});

------解决方案--------------------
探讨

引用:

但是我要在线程中是不能够给UI控件赋值的

跨线程修改控件属性?
委托创建者线程修改.

UIControlObj.Invoke();

请教一下,UIControlObj.Invoke();
此种方式能再详细点吗?比如给我个小实例也行,如果方便的话。

------解决方案--------------------
楼主是想问不同线程之间的传值问题吗?如果是的话可以这样

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);
}
}


当然还可以用委托