2014-10-27 3 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) и транслировать в комнату. –

+0

Я уже делаю объявление, что я допрашиваю, если способ, которым я в настоящее время это делаю, является потокобезопасным и как реализовать действие в StartNew Task –

ответ

0

Невозможно сказать, является ли ваш пример кода потокобезопасным или нет, если посмотреть на него. Это зависит от того, что делают методы Map.GetPlayerSpectators и Sending.SendMagicEffect.

Вы должны сделать шаг назад и рассмотреть, что произойдет, если другая задача изменит память, которую эти методы используют для генерации своих ответов. Может ли другая задача изменить список зрителей игроков? Используют ли методы Map.GetPlayerSpectators и Sending.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(); 

Скорее всего, что файлы не будут удалены. Основная задача - очистить список до того, как задача начнется.

Необходимо одновременно рассмотреть несколько задач, работающих в одной и той же памяти.

Смежные вопросы