簡體   English   中英

為什么在函數調用中分配后,我的列表為空?

[英]Why my List is null after being assigned in a function call?

這可能是一個愚蠢的問題。 但是,當我從Live SDK示例中修改一個示例時,遇到了一個奇怪的問題。

我以為根本原因是異步使用了GetAll()函數。

下面是代碼片段,我將問題作為注釋。 提前致謝!

class SkyeDriveViewModel: INotifyPropertyChanged
{
    private List<SkyDriveItem> folderList = null;
    public List<SkyDriveItem> FolderList
    {
        get { return folderList; }
        private set
        {
            if (value != folderList)
            {

                folderList = value;
                NotifyPropertyChanged("FolderList");
            }
        }
    }

    private async void GetAll(string desiredPath)
    {
        FolderList = new List<SkyDriveItem>();

        this.liveClient = new LiveConnectClient(SkyDrivePage.Session);
        try
        {
            LiveOperationResult operationResult = await this.liveClient.GetAsync(desiredPath);
            dynamic result = operationResult.Result;

            dynamic items = result.data;
            foreach (dynamic item in items)
            {
                SkyDriveItem newItem = new SkyDriveItem(item);
                if (newItem.IsFolder)
                {
                    FolderList.Add(newItem);
                }

            }

        }
        catch (LiveConnectException e)
        {
        }
        //**till here, FolderList was assigned**
    }

    public void InitList()
    {
        Debugger.Log();
        GetAll(SKYDRIVEINITPATH);
        Debugger.LogWhen(eDebugger.LogTiming.Exit); 
        //**till here, FolderList had zero item**
    }

}

通常,具有async void功能是一個警告信號。 您只應為事件處理程序使用這種方法。 GetAll的適當返回類型是Task ,甚至可能是Task<List<SkyDriveItem>>

問題在於,調用GetAll只會執行代碼,直到它遇到第一個await調用為止,此時它將返回給調用者,並且該方法的其余部分將異步執行。

這里的問題是,由於該方法void您無法知道何時完成。 您有一種“解雇后忘了”的方法,並且永遠無法知道列表實際准備就緒的時間。 如果GetAll返回一個任務,那么您可以await該任務,並確保您的列表已被實際填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM