文章 - 35,收藏 - , 评论 - 8, trackbacks - 0

近日正在学习MSMQ,在作练习时的一些问题,记下来,以备后用.呵呵....

当消息的发送及接收在同一进程中时,因为使用Receive方法在队列中没有消息时会阻塞整个线程,这样Send方法也不能被调用,为了实现接收和发送互不影响,想到把接收操作由另一个线程来执行,于是:               
               Thread thread = new Thread(new ThreadStart(receive));
                //thread.IsBackground = true;
                thread.Start();
receive方法是新线程用来执行接收消息的.定义如下
      private void receive()
        {
            while (isOK)
            {
                try
                {
                   msg = mq.Receive(new TimeSpan(0,0,10));
                   richTextBox1.AppendText(msg.Body.ToString()+ Environment.NewLine);
               }
                catch(MessageQueueException ex)
                {
                    MessageBox.Show(ex.Message);
                }
                Thread.Sleep(20);
            }
 
        }

结果问题出现在红色代码块中,错误信息是:richTextBox1不是此线程所创建.这个问题以前没有见到过.
经查,最后的解决办法是:再新建一个 delegate void AddMessage(string msg);  然后再用下面的代码替换掉红色代码:
     richTextBox1.Invoke(new AddMessage(addtext),msg.Body.ToString());

此时又需一个addtext方法:
        private void addtext(string msg)
        {
            richTextBox1.AppendText(msg + Environment.NewLine);
        }

这样,通过委托,解决了跨线程执行的问题.

原因分析:因为richTextBox1是主线程中创建的,而后来新创建的线程是不能直接访问它的.而控件的Invoke方法是可以在创建控件的线程上来执行一个指定的委托的.



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=977400


[点击此处收藏本文]  发表于2006年07月26日 12:24 PM




正在读取评论……

发表评论

大名
网址
验证码
评论