以下是我写的例子,大家有兴趣可以试一下。
private DataSet ds;
private DataTable dt; private void Form1_Load(object sender, System.EventArgs e)
{
ds=new DataSet("Test"); dt=ds.Tables.Add("TestTable"); 

dt.Columns.Add("Test", typeof(String)); dataGrid1.SetDataBinding(ds,"TestTable"); 

MessageQueue myQueue = new MessageQueue(".\\private$\\test_queue$");
myQueue.Formatter = new XmlMessageFormatter(new Type[]{typeof(String)}); myQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(MyReceiveCompleted);
         
myQueue.BeginReceive(); }

public void MyReceiveCompleted(Object source,ReceiveCompletedEventArgs asyncResult)
{
MessageQueue mq = (MessageQueue)source; System.Messaging.Message m = mq.EndReceive(asyncResult.AsyncResult);

DataRow dr=dt.NewRow();

dr["Test"]=(string)m.Body;

ds.Tables[0].Rows.Add(dr); mq.BeginReceive();
}

解决方案 »

  1.   

    谢谢大家~经过我半天的研究问题已经解决!多线程处理最适合于运行类模块的处理器密集型过程。与其他组件不同的是,从单独的线程直接调用控件中的方法会存在一些问题。影响控件的方法只应该在创建控件的线程上执行。由于从一个线程封送调用并跨线程边界将其发送到另一个线程会耗费大量的系统资源,所以应避免重复调用其他线程上的控件。在最佳情况下,从其他线程直接进行调用将耗费大量资源,进而使应用程序的性能受损。在最坏的情况下,将发生导致应用程序中出现死锁的情况,进而使执行冻结。不过,在有些情况下,您可能需要通过线程调用控件的方法。例如,您可能要在窗体上调用一个禁用按钮或更新显示的方法来响应某个线程执行的操作。.NET 框架提供从任何线程都可安全调用的方法,以调用与其他线程所拥有的控件进行交互的方法。Control.Invoke 方法允许同步执行控件上的方法,而 Control.BeginInvoke 方法则初始化异步执行。要使用这些方法,必须用与将调用的方法相同的签名声明委托。然后,您可以通过向要调用的方法提供适当的委托来调用窗体上任何控件的 Invoke 或 BeginInvoke 方法。任何必需的参数都包装在 Object 中,并被传输到该方法。