####0:讨论群html
qq群号:390313628 unity 4.6 版本运行ios
####参考 服务器代码:http://git.oschina.net/liyonghelpme/GameServerCsharpgit
参考文献: http://twistedoakstudios.com/blog/Post2061_emulating-actors-in-c-with-asyncawaitweb
http://www.codeproject.com/Articles/535635/Async-Await-and-the-Generated-StateMachinec#
https://msdn.microsoft.com/en-us/magazine/gg598924.aspx安全
https://msdn.microsoft.com/en-us/magazine/jj991977.aspx服务器
http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspxasp.net
http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers- and-synchronization-context.aspx异步
http://weblogs.asp.net/dixin/understanding-c-sharp-async-await-2-awaitable-awaiter-patternasync
http://everydaylifein.net/netframework/task-parallel-library-taskscheduler-deadlocks-threads.html
http://blogs.msdn.com/b/ericeil/archive/2009/04/23/clr-4-0-threadpool-improvements-part-1.aspx
####基本特征 Actor模式的游戏服务器的基本特征:
每一个Actor的属性都是私有的;
Actor的全部的公开的方法都是 async异步方法;
Actor全部方法的执行都须要队列化,也就是不容许多个函数在不一样的线程上执行,包括Actor内部方法和对外的Async方法。
####skynet基本实现 Skynet中是经过构建一个SkynetContext, 每一个Context附加有一个消息队列,当消息队列中有消息的时候,线程调度器,将这个队列调度到某个线程上去执行。每一个SkynetContext根据类型能够包含一个lua虚拟机。
####c#中实现 c#中为了实现上述机制,相关的重要概念包括:Task, synchronizationcontext, Async, Await;
Task是c#中的轻量级线程,由虚拟机来调度,存在多种Task的调度器,在本服务器中咱们使用 synchronizationcontext 调度器。
synchronizationcontext 是c#中一个抽象概念,用于声明一个执行领域,这个领域中的函数的执行是串行的,防止出现多个函数在多个线程上执行,形成数据访问冲突,本服务器中,每一个Actor是一个同步域,Actor的全部 函数都须要在同一个synchronizationcontext下执行。
async, await 是c#中实现的协程机制,经过调用await来保存当前的async函数的上下文运行状态,以便于当等待的任务完成以后,从新启动函数的执行,使用这个特性,是为了模拟skynet中lua服务器的协程机制。
####代码详解 服务器的核心代码是Actor.cs;
Actor的_messageQueue 属性,是一个synchronizationcontext, 用于同步Actor的全部函数执行。
Actor实现了一个RunTask函数,该函数启动一个Actor内部Task,该Task运行在Actor的synchronizationcontext中。
Stop函数用于终止整个Actor的运行。
ActorSynchronizationContext.cs
实现了一个能够使用await等待的,全部函数顺序执行的同步上下文。
在PlayerActor.cs 代码中展现了如何给Actor实现一个public async 方法,首先await 到Actor的messageQueue 上下文,接着执行后续的代码。
WorldActor中,展现了如何在当前Actor的上下文下启动一个Task, 以便安全的执行Task中的代码。