using System; using System.Collections.Generic; using System.Threading.Tasks; using Common.Base; using Common.Event; namespace Model { public class ActorComponent : Component { private readonly Queue msgEnvQueue = new Queue(); public Action msgAction = () => {}; public async void Run() { while (true) { Env env = await this.Get(); var message = env.Get(EnvKey.Message); int opcode = BitConverter.ToUInt16(message, 0); await World.Instance.GetComponent>().Run(opcode, env); } } public void Add(Env msgEnv) { this.msgEnvQueue.Enqueue(msgEnv); msgAction(); } private Task Get() { var tcs = new TaskCompletionSource(); if (this.msgEnvQueue.Count > 0) { Env env = this.msgEnvQueue.Dequeue(); tcs.SetResult(env); } else { msgAction = () => { msgAction = () => { }; Env msg = this.msgEnvQueue.Dequeue(); tcs.SetResult(msg); }; } return tcs.Task; } } }