轉帖|其它|編輯:郝浩|2010-12-24 14:44:11.000|閱讀 627 次
概述:眾所周知, 在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 > 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@fc6vip.cn
文章轉載自:博客轉載