[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"nullnull);

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


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

posted on 2009-01-11 02:28  NeilChen  阅读(2286)  评论(6编辑  收藏  举报

导航