我正在游戏服务器上工作,目前我有这个 宣布 类,它可以向连接的客户端宣布服务器中发生的任何事情
游戏服务器应该可以容纳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 :(得分: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();
可能永远不会删除文件。主任务将在任务开始之前清除列表。
您需要考虑同时在同一内存上运行的多个任务。