DataGrid实时刷新的问题

主  题:  DataGrid实时刷新的问题!
作  者:  Artist (黑猫警长)
等  级:  ^
信 誉 值:  90
所属论坛:  .NET技术 C#
问题点数:  100
回复次数:  7
发表时间:  2003-4-19 14:39:09

将一个DataSet绑定到DataGrid上,
从消息队列中异步接收消息,在事件处理方法中更新DataSet.

当执行DataSet.Tables[0].Rows.Add方法时,系统会卡住,不能响应其他操作。如:最大化,拖动窗口等。非常慢,好像死机。

但是如果把更新数据表的操作放在button的onclick事件中,就很正常,没有上述问题。

不知何故?

请指教!



回复人: Artist(黑猫警长) ( 一级(初级)) 信誉:90 2003-4-19 15:19:06 得分:0

以下是我写的例子,大家有兴趣可以试一下。

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

回复人: Artist(黑猫警长) ( 一级(初级)) 信誉:90 2003-4-19 22:01:41 得分:0

谢谢大家~经过我半天的研究问题已经解决!

多线程处理最适合于运行类模块的处理器密集型过程。与其他组件不同的是,从单独的线程直接调用控件中的方法会存在一些问题。影响控件的方法只应该在创建控件的线程上执行。由于从一个线程封送调用并跨线程边界将其发送到另一个线程会耗费大量的系统资源,所以应避免重复调用其他线程上的控件。在最佳情况下,从其他线程直接进行调用将耗费大量资源,进而使应用程序的性能受损。在最坏的情况下,将发生导致应用程序中出现死锁的情况,进而使执行冻结。

不过,在有些情况下,您可能需要通过线程调用控件的方法。例如,您可能要在窗体上调用一个禁用按钮或更新显示的方法来响应某个线程执行的操作。.NET 框架提供从任何线程都可安全调用的方法,以调用与其他线程所拥有的控件进行交互的方法。Control.Invoke 方法允许同步执行控件上的方法,而 Control.BeginInvoke 方法则初始化异步执行。要使用这些方法,必须用与将调用的方法相同的签名声明委托。然后,您可以通过向要调用的方法提供适当的委托来调用窗体上任何控件的 Invoke 或 BeginInvoke 方法。任何必需的参数都包装在 Object 中,并被传输到该方法。

该问题已经结贴 ,得分记录: rqxiang (20)、 Freddu (20)、 Marketdong (20)、 unfor (20)、 zhaoao5958 (20)、

Contributors: FHL