####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中的代碼。