C#列表变量
伙计们。 如何从另一个文件的列表中获取数据?我试着这样做,但它不起作用: CharacterController.csC#列表变量,c#,C#,伙计们。 如何从另一个文件的列表中获取数据?我试着这样做,但它不起作用: CharacterController.cs public class CharacterController { public static List<Character> Characters { get; set; } public static async Task LoadCharacterData(Client player) { var filter = new BsonDocument("
public class CharacterController
{
public static List<Character> Characters { get; set; }
public static async Task LoadCharacterData(Client player)
{
var filter = new BsonDocument("NameOfTable", player.Name);
var characters = await DatabaseManager.Characters.Find(filter).ToListAsync();
List<Character> Characters = new List<Character>();
foreach (var character in characters)
{
Characters.Add(new Character
{
Name = character.Name,
Surname = character.Surname
}
);
}
Console.WriteLine("TEST: " + Characters[0].Name + Characters[0].Surname); //It's working
}
在这种情况下,问题是您需要有一些方法来同步对
列表字符的访问
注意方法的签名LoadCharacterData
:
public static async Task LoadCharacterData(Client player)
{
// ...
}
这是一种异步方法。它不会同步运行。这意味着当您调用CharacterController.LoadCharacterData(player)时代码>您需要等待它完成
您可以通过使调用者异步
并使用等待
来实现这一点。尽管如此,我怀疑您无法更改onplayerdownload
的签名。在这种情况下,我会接受重新发布的任务
,然后等待它:
public void OnPlayerDownloaded(Client player)
{
var task = CharacterController.LoadCharacterData(player);
task.Wait(); // <---
Console.WriteLine("TEST: " + CharacterController.Characters[0].Name + CharacterController.Characters[0].Surname);
}
可选地,可以考虑同步访问属性或使用惰性初始化…但是请注意,
List
并没有告诉您有关客户机的任何信息。我不知道是否可以使用不同的客户端对LoadCharacterData
进行多次调用,这可能会覆盖彼此的工作。您能否更具体地说明“它不工作”的含义我怀疑您得到的是空引用异常,因为LoadCharacterData
尚未初始化字符
(请注意,它是一个异步方法)。在这种情况下,您就成功地访问了另一个文件中定义的字段。顺便说一下,List
不是线程安全的。是的,对不起。我有错误:System.NullReferenceException:对象引用未指向该对象的实例。你说得对。也许你会建议如何最好地重拍?谢谢。我将利用你的经验,听从你的建议。我已经做了,而且一切都正常)我希望以后我不会有任何问题。再次感谢。
public void OnPlayerDownloaded(Client player)
{
var task = CharacterController.LoadCharacterData(player);
task.Wait(); // <---
Console.WriteLine("TEST: " + CharacterController.Characters[0].Name + CharacterController.Characters[0].Surname);
}
List<Character> Characters = new List<Character>();
public static async Task<List<Character>> LoadCharacterData(Client player)
{
var filter = new BsonDocument("NameOfTable", player.Name);
var characters = await DatabaseManager.Characters.Find(filter).ToListAsync();
List<Character> result = new List<Character>();
foreach (var character in characters)
{
result.Add(new Character
{
Name = character.Name,
Surname = character.Surname
}
);
}
return result;
}