[Silverlight] 关于线程调用的扩展方法
2009-01-12 11:55:50 来源:WEB开发网Silverlight 里需要考虑异步调用的问题,比较麻烦。所以写了两个简单的扩展方法。
一个方法是为了更新 UI 控件。可以自动在不同的调用环境下判断是否需要 Invoke, 从而安全的调用控件相关的方法。
另一个方法的目的是把任务放到 ThreadPool 里去等待后续的异步执行。
代码如下:
usingSystem.Windows;
usingSystem;
usingSystem.Threading;
publicstaticclassThreadCallExtensions
{
///<summary>
///用于UI控件的更新,或其他情形。可自动判断当前线程是否为UI线程,
///而触发同步或异步调用。
///</summary>
///<paramname="obj"></param>
///<paramname="action"></param>
publicstaticvoidCallThreadSafely(thisDependencyObjectobj,Actionaction)
{
if(obj.CheckAccess())
{
action();
}
else
{
obj.Dispatcher.BeginInvoke(action);
}
}
///<summary>
///异步调用
///</summary>
///<paramname="obj"></param>
///<paramname="action"></param>
publicstaticvoidCallInBackground(thisDependencyObjectobj,Actionaction)
{
ThreadPool.QueueUserWorkItem(
delegate{
action();
});
}
}
一个调用示例:
vardb=CreateDataAccess();
//this是当前的Page
this.CallInBackground(
delegate{
varroles=db.FindAll<Role>("Role",null,null);
//listRoles是一个ListBox
listRoles.CallThreadSafely(
delegate{
listRoles.ItemsSource=roles;
});
});
这样,可以在调用方有效的减少很多因为满足同步/异步不同调用方式的需要而写的代码。
Tags:Silverlight 关于 线程
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接