彩票走势图

在Silverlight中实现异步任务队列

转帖|其它|编辑:郝浩|2010-12-24 14:44:11.000|阅读 602 次

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

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

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

  首先, 我们需要定义一个接口 IAsyncAction , 表示一个异步任务,代码如下:

1 public interface IAsyncAction {

2

3 void Execute();

4

5 event EventHandler Completed;

6 }

  这个接口非常简单, 调用 Execute 方法执行这个异步任务, 任务完成之后触发 Completed 事件。

  其次, 提供一个抽象实现 AsyncAction , 提供触发 Completed 事件的方法,代码如下:

01 public abstract class AsyncAction : IAsyncAction {

02

03 public abstract void Execute();

04

05 public event EventHandler Completed;

06

07 protected void OnCompleted() {

08 var completed = this.Completed;

09 if (completed != null) {

10 completed(this, EventArgs.Empty);

11 }

12 }

13 }

  再提供一个 AsyncActionRunner ,负责执行多个异步任务,代码如下:

01 public class AsyncActionRunner : AsyncAction {

02

03 private readonly IEnumerator < IAsyncAction > _enumerator;

04

05 public AsyncActionRunner(IEnumerator < IAsyncAction &gt; enumerator) {

06 this._enumerator = enumerator;

07 }

08

09 public override void Execute() {

10 if (this._enumerator.MoveNext()) {

11 this._enumerator.Current.Completed += delegate {

12 this.Execute();

13 };

14 this._enumerator.Current.Execute();

15 }

16 else {

17 this.OnCompleted();

18 }

19 }

20 }

最后再提供使用 AsyncActionRunner 的示例代码:

01 // a sample async action

02 public class SampleAsyncAction : AsyncAction { }

03

04 public class TestAsyncActionRunner {

05

06 public IEnumerator < IAsyncAction > PrepareAsyncTasks() {

07 // task 1

08 yield return new SampleAsyncAction();

09 // and task 2

10 yield return new SampleAsyncAction();

11 // and more task ...

12 }

13

14 public void RunAllAsyncTasks() {

15 var tasks = this.PrepareAsyncTasks();

16 var runner = new AsyncActionRunner(tasks);

17 runner.Completed += delegate {

18 Console.WriteLine("All Async task done!");

19 };

20 }

21 }

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

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:博客转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP