近日正在学习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