2017-04-16 73 views
-1

夥計。 如何從另一個文件中的列表中獲取數據?我嘗試這種方式,但它不工作:C#列表變量

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 
} 

在另一個文件中:

public void OnPlayerDownloaded(Client player) 
{ 
    CharacterController.LoadCharacterData(player); 
    Console.WriteLine("TEST: " + CharacterController.Characters[0].Name + CharacterController.Characters[0].Surname); // It's don't working 
} 
+0

你能更具體地說明「它不工作」的含義嗎? - 我懷疑你得到一個空引用異常,因爲'LoadCharacterData'沒有初始化'Characters'(注意它是一個異步方法)。在這種情況下,您可以成功訪問另一個文件中定義的字段。順便說一句,'List '不是線程安全的。 – Theraot

+0

對,對不起。我有錯誤: System.NullReferenceException:對象引用不指向對象的一個​​實例。 你說得對。 也許你會建議如何最好地重拍? – Joseph

回答

1

在這種特殊情況下,問題是,你需要有一些手段同步訪問List<Character> Characters

通知方法LoadCharacterData的簽名:

public static async Task LoadCharacterData(Client player) 
{ 
    // ... 
} 

它是一個異步方法。它不會同步運行。這意味着當您撥打CharacterController.LoadCharacterData(player);時,您需要等待它完成。

您可以通過撥打電話async並使用await來完成此操作。雖然,我懷疑你不能更改OnPlayerDownloaded的簽名。在這種情況下,我把retunred Task,等待就可以了:

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>(); 

這裏,你沒有使用該財產。您正在創建一個具有相同名稱的局部變量。


現在,還有另一個隱藏的問題... List<Character>不是線程安全的。考慮一下如果你有兩次同時運行LoadCharacterData的電話會造成的問題! - List<Character>不適用於處理該問題。

我建議重寫LoadCharacterData返回Task<List<Characater>>,並使其返回的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; 
} 

另外,還可以考慮同步訪問屬性或使用延遲初始化...但請注意,List<Character>沒有提供任何關於Client的信息。我不知道是否可以多次撥打LoadCharacterData與不同Client可能會覆蓋其他工作。

+0

謝謝。我將利用您的經驗並遵循您的建議。我已經做到了,一切正常)我希望以後我不會有任何問題。再次感謝。 – Joseph