为Windows应用创建简单的异步调用模式
2007-09-01 21:35:00 来源:WEB开发网public void CustomerDataCallback( IAsyncResult ar )
{
// Retrieve the customer data.
_customerData = _proxy.EndGetCustomerData( ar );
}
现在,你必须注意,这一方法是被后台工作线程调用的。如果想在前台界面上使用刚刚获得的信息(例如在一个data grid控件中显示那些客户数据),一定不要忘记在用户界面线程中进行更新。如果忘了这样做,就会发生很多莫名其妙的错误,而且调试起来还相当的不易。
那么我们怎么切换线程呢?我们可以使用服务代理的方法,所有的控件都源自这些对象的实现。我们可以实现一个从用户界面线程调用的方法,在这个方法内我们可以安全的更新我们的界面。使用Control.Invoke方法,我们必须给用户更新方法传递一个委托,现在,CustomerDataCallback方法的代码更新如下:
public void CustomerDataCallback( IAsyncResult ar )
{
// Retrieve the customer data.
_customerData = _proxy.EndGetCustomerData( ar );
// Create an EventHandler delegate.
EventHandler updateUI = new EventHandler( UpdateUI );
// Invoke the delegate on the UI thread.
this.Invoke( updateUI, new object[] { null, null } );
}
UpdateUI方法可以按如下办法实现:
private void UpdateUI( object sender, EventArgs e )
{
// Update the user interface.
_dataGrid.DataSource = _customerData;
}
这并不是十分非常严谨科学,因此可以使这一“两次跳转”的复杂问题简单化起来。关键在于异步方法的原始调用(以WinForm类为例)用来负责转换线程,并且需要另一个委托以及Control.Invoke方法。
更多精彩
赞助商链接