C#列表变量

C#列表变量,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("

伙计们。 如何从另一个文件的列表中获取数据?我试着这样做,但它不起作用:

CharacterController.cs

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;
}