[导入]How can I update my user interface from a thread that did not create it?

博客介绍了更新用户界面元素操作必须在创建该UI元素的线程上进行。通过Control类的Invoke方法,可在指定线程执行委托。还给出更新TextBox文本的示例,同时提醒不要使用匹配EventHandler委托签名的方法,因Control类的Invoke实现对其参数处理有差异。

When performing any action on a control which requires the updating of a user interface element (e.g. setting the Text property on almost any class derived from Control, updating the data source behind a DataGrid), these operations MUST take place on the thread that created the UI element.

In order to do this, the Control class provides the Invoke method, which will take a delegate and execute it on the thread that the UI element was created on. In order to use this, one must declare a function that performs the UI operation. For example, say a form has a TextBox on it named m_TextBox. To update the text from another thread, create a method that will update the Text property on the TextBox:


 
 TextBox m_TextBox;


  UpdateText( text)
{
  
  m_TextBox.Text = text;
}

Now, create a delegate that has the same signature as the method that was previously defined:

   UpdateTextCallback( text);

In your thread, you can call the Invoke method on m_TextBox, passing the delegate to call, as well as the parameters.

m_TextBox.Invoke( UpdateTextCallback(.UpdateText), 
[]{”Text generated on non-UI thread.”});

Note: Do not create a method that matches the EventHandler delegate signature and pass that. The implementation of Invoke on the Control class will not take into account the parameters passed to Invoke if the type of the delegate is EventHandler. It will pass the control that Invoke was called on for the sender parameter as well as the value returned by EventArgs.Empty for the e parameter.

[Author: Nicholas Paldino]

91685.aspx
文章来源: http://blogs.msdn.com/csharpfaq/archive/2004/03/17/91685.aspx

转载于:https://www.cnblogs.com/sgsoft/archive/2004/09/22/45397.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值