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 ,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值