为什么我的列表在函数调用中被分配后为空

本文关键字:分配 我的 列表 函数调用 为什么 | 更新日期: 2023-09-27 18:13:53

这可能是一个愚蠢的问题。但是当我修改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该任务,并确保您的列表实际上已经填充。