Я создал диспетчер сервера CSGO и получаю сообщение об ошибке: «System.IndexOutOfRangeException: индекс находился за пределами массива».
Я использовал try / catch для всего метода, но этопо-прежнему заканчивается ошибкой во время выполнения.Я использовал блокировку для асинхронного метода.
//Calling the method
try
{
GetConnectedData(newData.Split(new string[] { "\n", "\r" },
StringSplitOptions.RemoveEmptyEntries));
}
catch (Exception ex)
{
//Writing some error data to file
}
//The GetConnectedData Method (It's not pretty, but it's what I have to work with)
private async void GetConnectedData(string[] data)
{
while (connectedDataLock)
await Task.Delay(100);
connectedDataLock = true;
bool clientChange = false;
for (int i = 0; i < data.Length; i++)
{
if (!currentConnectedFirst)
{
if (data[i].StartsWith("Client \"") && data[i].Contains("connected"))
{
clientChange = true;
}
else if (data[i].StartsWith("Dropped ") && data[i].Contains("from server"))
{
clientChange = true;
}
else if (data[i] == "Server is hibernating")
{
clientChange = false;
foreach (Player player in players)
Tool.Log("Player \"" + player.Name + "\" disconnected from the server");
currentConnected.Clear();
players.Clear();
}
else if (data[i] == "# userid name uniqueid connected ping loss state rate adr")
{
try
{
//pendingPlayerUpdate = false;
int j = i + 1;
while (data[j] != "#end")
j++;
List<string> currentConnectedNew = new List<string>();
players.Clear();
for (int k = i + 1; k < j; k++)
{
string[] playerData = data[k].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (playerData.Length >= 10)
{
if (playerData.Length > 10)
{
List<int> locations = new List<int>();
for (int d = 0; d < playerData.Length; d++)
{
if (playerData[d].StartsWith("\""))
locations.Add(d);
if (playerData[d].EndsWith("\""))
locations.Add(d);
}
int begin = locations[0];
int last = locations[1];
List<string> newPlayerData = new List<string>();
newPlayerData.AddRange(playerData.Take(begin));
string name = "";
for (int l = begin; l <= last; l++)
name += playerData[l] + " ";
newPlayerData.Add(name.Substring(0, name.Length - 1));
newPlayerData.AddRange(playerData.Skip(last + 1));
playerData = newPlayerData.ToArray();
}
Player player = new Player()
{
Name = playerData[3].Substring(1, playerData[3].Length - 2),
SteamId = playerData[4]
};
if (players.Where(p => p.SteamId == player.SteamId).Count() == 0)
{
uniquePlayers.Add(player);
players.Add(player);
uniquePlayers = uniquePlayers.GroupBy(p => new { p.SteamId })
.Select(p => p.Last())
.ToList();
currentConnectedNew.Add(player.Name);
if (!uniqueConnections.Contains(player.Name))
uniqueConnections.Add(player.Name);
}
}
}
for (int m = 0; m < currentConnectedNew.Count; m++)
{
if (currentConnected.IndexOf(currentConnectedNew[m]) == -1) //Connected
{
currentConnected.Add(players[m].Name);
Tool.Log("Player \"" + players[m].Name + "\" connected to the server (" + players[m].SteamId + ")");
}
}
List<string> left = currentConnected.Except(currentConnectedNew).ToList(); //Might be an error **************************
for (int m = 0; m < left.Count; m++)
{
currentConnected.Remove(left[m]);
Tool.Log("Player \"" + left[m] + "\" disconnected from the server");
}
}
catch /*(Exception ex)*/
{
//pendingPlayerUpdate = true;
}
}
else if (data[i].StartsWith("L") && data[i].Contains(".smx") && data[i].Contains("\"") && !data[i].Contains("changed cvar"))
{
serverCommands.Add(data[i]);
Tool.Log(data[i].Substring(data[i].IndexOf('\"')));
}
else if (data[i].StartsWith("*** Map Load:"))
{
if (data[i - 2] != "Server waking up from hibernation")
{
string mapName = data[i].Substring("*** Map Load: ".Length);
mapName = mapName.Substring(0, mapName.IndexOf(':'));
Tool.Log("Map changed to: " + mapName);
}
}
else if (data[i].StartsWith("Host_NewGame on map"))
{
string mapName = data[i].Substring("Host_NewGame on map ".Length);
Tool.Log("Map changed to: " + mapName);
}
else if (data[i].Contains(":"))
{
if (data[i].StartsWith("Console:"))
Tool.Log(data[i]);
else
{
foreach (Player player in players)
{
if (data[i].StartsWith(player.Name) ||
data[i].StartsWith("(Terrorist) " + player.Name) ||
data[i].StartsWith("(Counter-Terrorist) " + player.Name))
Tool.Log(data[i]);
}
}
}
}
if (autoUpdate && !autoUpdateTempBlock && data[i].ToLower().StartsWith("your server is out of date"))
{
autoUpdateTempBlock = true;
if (currentConnected.Count > 0 && Tool.lstHandles.Count == 0)
{
//for (int j = 5; j > 0; j--) //Not displaying correctly, hard coding instead
//{
// _ = Tool.MessageServer("server will update and restart in " + i + " minutes.", true);
// await Task.Delay(60000);
//}
_ = Tool.MessageServer("server will update and restart in 5 minutes.", true);
await Task.Delay(60000);
_ = Tool.MessageServer("server will update and restart in 4 minutes.", true);
await Task.Delay(60000);
_ = Tool.MessageServer("server will update and restart in 3 minutes.", true);
await Task.Delay(60000);
_ = Tool.MessageServer("server will update and restart in 2 minutes.", true);
await Task.Delay(60000);
_ = Tool.MessageServer("server will update and restart in 1 minute.", true);
await Task.Delay(60000);
await Tool.MessageServer("Server will shutdown in", true);
await Task.Delay(1000);
_ = Tool.MessageServer("5", true);
await Task.Delay(1000);
_ = Tool.MessageServer("4", true);
await Task.Delay(1000);
_ = Tool.MessageServer("3", true);
await Task.Delay(1000);
_ = Tool.MessageServer("2", true);
await Task.Delay(1000);
_ = Tool.MessageServer("1", true);
await Task.Delay(1000);
//for (int j = 5; j >= 0; j--)
//{
// _ = Tool.MessageServer(j.ToString(), true);
// await Task.Delay(1000);
//}
foreach (string player in currentConnected)
await Tool.MessageServer("kick \"" + player + "\"", false);
await Task.Delay(1000);
}
Tool.KillServer();
Process updateServer = Tool.UpdateServer();
if (updateServer != null)
{
await Task.Delay(10000);
while (!updateServer.HasExited)
await Task.Delay(5000);
SaveSettings();
Tool.StartServer();
}
else
{
MessageBox.Show("Restart server manually", Info.programTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
autoUpdateTempBlock = false;
}
}
lnkCurrentlyConnected.Text = "*Currently Connnected: " + currentConnected.Count;
lblTotalConnections.Text = "Total Connnections: " + totalConnections;
lnkUniqueConnecions.Text = "*Unique Connnections: " + uniqueConnections.Count;
if (currentConnectedFirst /*|| pendingPlayerUpdate*/ || clientChange)
{
clientChange = false;
await Tool.MessageServer("status", false);
//pendingPlayerUpdate = true;
}
currentConnectedFirst = false;
connectedDataLock = false;
}
Текст исключения: System.IndexOutOfRangeException: индекс находился за пределами массива.at CSGO_Server_Manager.CfrmMain.d__39.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.AsyncMethodBuilderCore. <> c.b__6_0 (состояние объекта)