本文作為自己的筆記,是依照自身的理解所編寫的,不是很嚴謹
如果有什麼錯誤的地方,可以在下方的 gitalk 留言通知我
Active Object Pattern 是一個實做多執行緒工作的技術,它會配合著 Command Pattern 一起使用
下面是一個簡單的 Active Object :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public interface ICommand { void Execute(); }
public class ActiveObject { List<ICommand> commands = new List<ICommand>(); public void AddCommand(ICommand command) { this.commands.Add(command); } public void Run() { while (this.commands.Count > 0) { this.commands[0].Execute(); this.commands.RemoveAt(0); } } }
|
你可以發現 Active Object 就只是一直執行指令而已,有趣的是,當有你一直從增加指令進去,Active Object 是不會停下來的。因此可以透過不斷的重放同一個指令來達到延遲的效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class DelayPringMessageCommand : ICommand { ActiveObject activeObject; bool start = false; DateTime startTime; int delay; string message; public DelayPrintMessageCommand(ActiveObject activeObject, string message, int ms) { this.activeObject = activeObject; this.message = message; this.delay = ms; } public void Execute() { DateTime currentTime = DateTime.Now; if (!start) { this.start = true; this.startTime = currentTime; this.activeObject.AddCommand(this); return; } TimeSpan elapsed = currentTime - this.executeTime if (elapsed.TotalMilliseconds < this.delay) { this.activeObject.AddCommand(this); return; } Console.WriteLine(this.message); } }
|
與一般執行緒不同,Active Object 中的指令並不會在等待執行時進行阻塞,而是會一直把自己加回去指令串列,等待再次執行。
只要一直有指令加進去,這個程式就不會結束,它將會執行到所有任務都結束為止。