[英]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.