标签:status C# 模型 messages Actor void message public
网上关于Actor的内容有很多,这里提供一种简单的实现。直接上码:
1 public abstract class Actor<T> 2 { 3 public static readonly int StateWaiting = 0; 4 public static readonly int StateExecuting = 1; 5 public static readonly int StateExit = 2; 6 7 private readonly Queue<T> _messages; 8 private volatile int _status; 9 10 public bool IsBusy => _status == StateExecuting; 11 12 protected Actor() 13 { 14 _messages = new Queue<T>(); 15 } 16 17 public void Receive(T message) 18 { 19 if (IsValid(message)) 20 { 21 lock (_messages) 22 { 23 _messages.Enqueue(message); 24 } 25 26 StartHandleMessage(); 27 } 28 } 29 30 protected abstract bool IsValid(T message); 31 32 private void StartHandleMessage() 33 { 34 if (Interlocked.CompareExchange(ref _status, StateExecuting, StateWaiting) == StateWaiting) 35 { 36 var msg = _messages.Dequeue(); 37 ThreadPool.QueueUserWorkItem(DoHandleMessage, msg); 38 } 39 } 40 41 private void DoHandleMessage(object message) 42 { 43 if (_status != StateExit) 44 { 45 HandleMessageImpl((T)message); 46 47 if (_messages.Count > 0) 48 { 49 var msg = _messages.Dequeue(); 50 DoHandleMessage(msg); 51 } 52 else 53 { 54 _status = StateWaiting; 55 } 56 } 57 } 58 59 protected abstract void HandleMessageImpl(T message); 60 61 public void Exit() 62 { 63 _status = StateExit; 64 } 65 } 66 }
标签:status,C#,模型,messages,Actor,void,message,public 来源: https://www.cnblogs.com/tianlang358/p/16577665.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。