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