我创建了一个基于拆分页面示例应用程序的 Windows 8 Metro 应用程序。但是,在示例应用程序中,数据是在构造函数中同步加载的。我正在访问一个文本文件,因此需要异步加载数据。构造函数如下所示:
public MyDataSource()
{
DataLoaded = false;
LoadData();
}
LoadData()
是填充数据模型的异步方法。这工作正常,并按加载它的方式显示数据(这是我想要的行为)。当我尝试测试挂起和终止时会出现问题。问题是恢复有可能在填充数据模型之前尝试访问它:
public static MyDataGroup GetGroup(string uniqueId)
{
// If the data hasn't been loaded yet then what?
if (_myDataSource == null)
{
// Where app has been suspended and terminated there is no data available yet
}
// Simple linear search is acceptable for small data sets
var matches = _myDataSource.AllGroups.Where((group) => group.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
我可以通过将构造函数更改为 call 来解决此问题LoadData().Wait
,但这意味着应用程序会锁定 UI 线程。我相信我需要的是一种让恢复代码GetGroup
等待直到数据加载而不锁定 UI 线程的方法。这是可能的还是可取的,如果是的话,怎么做?
编辑:
一两个人建议将任务缓存为LoadData()
. 这是一个好主意,但里面的代码GetGroup
是由页面状态管理部分调用的,因此不能是异步的。为了解决这个问题,我尝试了以下方法:
if (!DataLoaded)
{
//dataLoading = await MyDataSource.LoadData();
dataLoading.RunSynchronously();
}
但这给了我一个错误:
RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method.
和
dataLoading.Wait()
只是锁定用户界面。