[Silverlight] 关于线程调用的扩展方法

Silverlight 里需要考虑异步调用的问题,比较麻烦。所以写了两个简单的扩展方法。

一个方法是为了更新 UI 控件。可以自动在不同的调用环境下判断是否需要 Invoke, 从而安全的调用控件相关的方法。

另一个方法的目的是把任务放到 ThreadPool 里去等待后续的异步执行。
代码如下:
using  System.Windows;
using  System;
using  System.Threading;

public   static   class  ThreadCallExtensions
{
    
///   <summary>
    
///  用于 UI 控件的更新,或其他情形。可自动判断当前线程是否为 UI 线程,
    
///  而触发同步或异步调用。
    
///   </summary>
    
///   <param name="obj"></param>
    
///   <param name="action"></param>
     public   static   void  CallThreadSafely( this  DependencyObject obj, Action action)
    {
        
if  (obj.CheckAccess())
        {
            action();
        }
        
else
        {
            obj.Dispatcher.BeginInvoke(action);
        }
    }

    
///   <summary>
    
///  异步调用
    
///   </summary>
    
///   <param name="obj"></param>
    
///   <param name="action"></param>
     public   static   void  CallInBackground( this  DependencyObject obj, Action action)
    {
        ThreadPool.QueueUserWorkItem(
            
delegate  {
                action();
            });
    }
}


一个调用示例:
var db  =  CreateDataAccess();

//  this 是当前的 Page
this .CallInBackground(
    
delegate  {
        var roles 
=  db.FindAll < Role > ( " Role " null null );

        
//  listRoles 是一个 ListBox
        listRoles.CallThreadSafely(
            
delegate  {
                listRoles.ItemsSource 
=  roles;
            });
    });


这样,可以在调用方有效的减少很多因为满足同步/异步不同调用方式的需要而写的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值