不太會畫圖,先簡單看下 程序流程,他比 其餘 服務器 多了 一個 單獨的 線程 內部數據庫 物理運算,也就是 他的運算 不須要 客戶端 時時給信息。sql
下面是 片斷代碼。數據庫
var bootstrap = BootstrapFactory.CreateBootstrap(); if (!bootstrap.Initialize()) { Console.WriteLine("沒法初始化"); Console.ReadKey(); return; } var result = bootstrap.Start(); Console.WriteLine("服務器啓動: {0}!", result); if (result == StartResult.Failed) { Console.WriteLine("沒法啓動"); Console.ReadKey(); return; } Console.WriteLine("線程池開啓!"); ThreadPoolMain.OnStartThreadPool();
public static void OnStartThreadPool() { cs = "server=127.0.0.1;database=playgame;user=sa;pwd=zzjzzj888;pooling=true;min pool size=10;max pool size=10000"; OnSqlHelper = new SqlHelper(cs); //新建ManualResetEvent對象而且初始化爲無信號狀態 ManualResetEvent eventX = new ManualResetEvent(false); ThreadPool.SetMaxThreads(12, 12); //線程池 ThreadQueue Queue = new ThreadQueue(); while (OnReadSql()>0) { Console.WriteLine("結束並修改數據庫!!"); Queue.QueueWorkItem(eventX, taskcount);//分配任務 eventX = new ManualResetEvent(false); } } static int taskcount; //讀取數據庫,若是沒符合條件 等待後繼續讀取 static int OnReadSql() { // 讀取數據庫數據,拿到最新的 當前時間點 以內 的數據。 //排序這列數據。 taskcount = sqls();//任務數量 if (taskcount == 0) { Thread.Sleep(11);//若是沒有數據,則2秒鐘後繼續尋找 OnReadSql(); } return taskcount; }
public bool QueueWorkItem(ManualResetEvent eventX, int task) { Console.WriteLine("主線程運行開始"); Thread.Sleep(1000); ThreadProcClass t = new ThreadProcClass(task, eventX); for (int i = 0; i < task; i++) { JsonData json = new JsonData(); json["name"] = "zzj" + i; json["message"] = "ok" + i; ThreadPool.QueueUserWorkItem(new WaitCallback(t.ThreadProc), new SomeState(json)); } //等待事件的完成,即線程調用ManualResetEvent.Set()方法 //eventX.WaitOne 阻止當前線程,直到當前 WaitHandle 收到信號爲止。 eventX.WaitOne(Timeout.Infinite, true); return true; }
public ThreadProcClass(int count, ManualResetEvent mre) { iMaxCount = count; eventX = mre; } public static int iCount = 0; public static int iMaxCount = 0; public ManualResetEvent eventX; public void ThreadProc(object i) { Console.WriteLine("Thread " + ((SomeState)i).json.ToJson()); Thread.Sleep(1111); //Interlocked.Increment()操做是一個原子操做,做用是:iCount++ 具體請看下面說明 //原子操做,就是不能被更高等級中斷搶奪優先的操做。你既然提這個問題,我就說深一點。 //因爲操做系統大部分時間處於開中斷狀態, //因此,一個程序在執行的時候可能被優先級更高的線程中斷。 //而有些操做是不能被中斷的,否則會出現沒法還原的後果,這時候,這些操做就須要原子操做。 //就是不能被中斷的操做。 Interlocked.Increment(ref iCount); if (iCount == iMaxCount) { // Console.WriteLine("最後一個子線程發出結束信號!"); //將事件狀態設置爲終止狀態,容許一個或多個等待線程繼續。 iCount = 0; eventX.Set(); } }