tao*_*tao 1 c# asynchronous sync
这可能是一个愚蠢的问题.但是,当我从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**
}
}
Run Code Online (Sandbox Code Playgroud)
通常,具有async void功能是警告标志.你应该只有一个事件处理程序的方法.适当的返回类型GetAll是Task,甚至可能是Task<List<SkyDriveItem>>.
问题是调用GetAll只会执行代码,直到它遇到第一次await调用,此时它将返回调用者,并且方法的其余部分将异步执行.
这里的问题是,因为方法是void你无法知道它什么时候完成.你有一个"即发即弃"的方法,永远不知道你的列表何时准备就绪.如果GetAll返回任务,那么您可以执行await该任务并确保您的列表实际已填充.
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |