Warning
本文作為自己的筆記,是依照自身的理解所編寫的,不是很嚴謹 如果有什麼錯誤的地方,可以在下方的 gitalk 留言通知我
Active Object Pattern 是一個實做多執行緒工作的技術,它會配合著 一起使用
下面是一個簡單的 Active Object :
// ICommand.cs
public interface ICommand {
void Execute();
}
// ActiveObject.cs
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 是不會停下來的。因此可以透過不斷的重放同一個指令來達到延遲的效果:
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 中的指令並不會在等待執行時進行阻塞,而是會一直把自己加回去指令串列,等待再次執行。
只要一直有指令加進去,這個程式就不會結束,它將會執行到所有任務都結束為止。