2014-10-27 21 views
0

我正在研究遊戲服務器,目前我有這個宣佈類,它向連接的客戶端通告發生在服務器中的任何事情。C#任務具有不同參數的動作

遊戲服務器應該能夠容納超過400名玩家而沒有麻煩。

到目前爲止,這是試圖宣佈在地圖上的效果,所有在場的球員,當我在做什麼:

public static void AnnounceMagicEffect(byte effect, UInt16 x, UInt16 y, byte z) { 
      Task.Factory.StartNew(() => { 
       List<Player> spectators = Map.GetPlayerSpectators(x, y, z); 
       foreach (Player player in spectators) { 
        Sending.SendMagicEffect(player, effect, x, y, z); 
       } 
      }); 
     } 

基本上我會編程,都應該宣佈後話了超過50個功能遊戲中的觀衆。

此線程安全嗎? 這是完成這項任務的正確方法嗎?

起初我想做出這樣一個功能:

public static void AddGameTask(Action action) { 
    Task.Factory.StartNew(() => action); 
} 

但它不支持的參數,因爲我可能會使用它們,如:

AnnouncePlayerMove(Player player, Direction direction); 
AnnouncePlayerSay(Player player, string text); 

我怎樣才能做到這一點?

+0

更多的是「我如何實現這一點」而不是你現有的代碼是否是線程安全的。要宣佈「所有相關方」,您可以實施SignalR集線器(或WebSockets房間)並向房間廣播。 – 2014-10-27 01:54:34

+0

我在做宣佈,我在質疑的是,如果我目前正在做這件事的方式是線程安全的,以及如何將Action 應用於StartNew Task – 2014-10-27 02:09:21

回答

0

不能通過查看代碼示例是否線程安全。這取決於Map.GetPlayerSpectatorsSending.SendMagicEffect方法的作用。

您必須退後一步,考慮如果另一個任務修改了這些方法用於生成其響應的內存,會發生什麼情況。另一項任務是否可以修改玩家觀衆列表? Map.GetPlayerSpectatorsSending.SendMagicEffect方法是修改數據,還是隻讀取數據?

將您的方法AnnounceMagicEffect更改爲接受任何操作委託使其變得更模糊。誰知道它的線程是否安全?

當您創建任務時,它將共享任務創建之前存在的內存及其創建任務。

拿這個例子:

List<string> listOfFiles = new List<string>(); 
listOfFiles.Add(filename1); 
listOfFiles.Add(filename2); 
listOfFiles.Add(filename3); 

Task.Run(() => 
{ 
    foreach(string file in citationFiles) 
    File.Delete(file); 
}); 

citationFiles.Clear(); 

機會是,這些文件將永遠不會被刪除。主要任務將在任務開始之前清除列表。

您需要考慮同時在同一內存上運行多個任務。

相關問題