WEB开发网
开发学院图形图像Flash [Silverlight] 关于线程调用的扩展方法 阅读

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

 2009-01-12 11:55:50 来源:WEB开发网   
核心提示:Silverlight 里需要考虑异步调用的问题,比较麻烦,[Silverlight] 关于线程调用的扩展方法,所以写了两个简单的扩展方法,一个方法是为了更新 UI 控件,///而触发同步或异步调用,///</summary>///<paramname="obj"></

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 关于 线程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接