为什么我的列表在函数调用中被分配后为空
本文关键字:分配 我的 列表 函数调用 为什么 | 更新日期: 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
该任务,并确保您的列表实际上已经填充。