Silverlight 异步任务队列实现

简介:

众所周知, 在 Silverlight 运行时中, 不允许堵塞 UI 的操作出现, 很多操作只能通过异步实现。 但是, 在 Silverlight 的实际开发工作中, 经常出现需要将多个异步操作按照一定的顺序执行, 因而需要一个能够按照顺序执行异步任务的队列, 下面是一个简单的设计:

  1. 首先, 我们需要定义一个接口 IAsyncAction , 表示一个异步任务,代码如下:
    1
    2
    3
    4
    5
    6
    public  interface  IAsyncAction {
     
        void  Execute();
     
        event  EventHandler Completed;
    }
    这个接口非常简单, 调用 Execute 方法执行这个异步任务, 任务完成之后触发 Completed 事件。
  2. 其次, 提供一个抽象实现 AsyncAction , 提供触发 Completed 事件的方法,代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public  abstract  class  AsyncAction : IAsyncAction {
     
        public  abstract  void  Execute();
     
        public  event  EventHandler Completed;
     
        protected  void  OnCompleted() {
           var  completed = this .Completed;
           if  (completed != null ) {
              completed( this , EventArgs.Empty);
           }
        }
    }
  3. 再提供一个 AsyncActionRunner ,负责执行多个异步任务,代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public  class  AsyncActionRunner : AsyncAction {
     
        private  readonly  IEnumerator < IAsyncAction > _enumerator;
     
        public  AsyncActionRunner(IEnumerator < IAsyncAction > enumerator) {
           this ._enumerator = enumerator;
        }
     
        public  override  void  Execute() {
           if  ( this ._enumerator.MoveNext()) {
              this ._enumerator.Current.Completed += delegate  {
                 this .Execute();
              };
              this ._enumerator.Current.Execute();
           }
           else  {
              this .OnCompleted();
           }
        }
    }
  4. 最后再提供使用 AsyncActionRunner 的示例代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // a sample async action
    public  class  SampleAsyncAction : AsyncAction { }
     
    public  class  TestAsyncActionRunner {
     
        public  IEnumerator < IAsyncAction >  PrepareAsyncTasks() {
           // task 1
           yield  return  new  SampleAsyncAction();
           // and task 2
           yield  return  new  SampleAsyncAction();
           // and more task ...
        }
     
        public  void  RunAllAsyncTasks() {
           var  tasks = this .PrepareAsyncTasks();
           var  runner = new  AsyncActionRunner(tasks);
           runner.Completed += delegate  {
              Console.WriteLine( "All Async task done!" );
           };
        }
    }

有了这样一个 AsyncActionRunner , 按照指定的顺序执行一些异步操作就很容易了, 希望这个想法能对大家有所帮助。

张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。

本博客已经迁移到 GitHub , 围观地址: http://beginor.github.io/

本文转自张志敏博客园博客,原文链接:http://www.cnblogs.com/beginor/archive/2010/12/24/1915910.html ,如需转载请自行联系原作者
相关文章
|
11月前
|
Java 数据处理 C++
c++11线程池的实现原理及回调函数的使用
c++11线程池的实现原理及回调函数的使用
|
消息中间件 JavaScript 前端开发
js的EventLoop事件循环机制调用栈、微任务、消息队列执行顺序优先级
js的EventLoop事件循环机制调用栈、微任务、消息队列执行顺序优先级
91 0
【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )(二)
【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )(二)
108 0
|
Android开发
【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )(一)
【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )(一)
160 0
【EventBus】EventBus 源码解析 ( 事件发送 | 发布线程为 子线程 切换到 主线程 执行订阅方法的过程分析 )
【EventBus】EventBus 源码解析 ( 事件发送 | 发布线程为 子线程 切换到 主线程 执行订阅方法的过程分析 )
146 0