增量加载列表视图中的项
本文关键字:视图 列表 加载 | 更新日期: 2023-09-27 17:51:01
我采用了以下来自MSDN的示例,用于在WinRT应用程序的列表视图中增量加载缩略图:
https://code.msdn.microsoft.com/windowsapps/Data-Binding-7b1d67b5我想删除下面的"await Task.Delay(10)"行。当我这样做时,我得到一个警告,该方法缺少await操作符。
protected async override Task<IList<object>> LoadMoreItemsOverrideAsync(System.Threading.CancellationToken c, uint count)
{
uint toGenerate = System.Math.Min(count, _maxCount - _count);
// Wait for work
await Task.Delay(10);
// This code simply generates
var values = from j in Enumerable.Range((int)_count, (int)toGenerate)
select (object)_generator(j);
_count += toGenerate;
return values.ToArray();
}
我尝试重写该方法,并将整个方法包装在一个任务中,如下所示:
protected async override Task<IList<object>> LoadMoreItemsOverrideAsync(System.Threading.CancellationToken c, uint count)
{
return await Task.Run(() => {
uint toGenerate = System.Math.Min(count, _maxCount - _count);
// This code simply generates
var values = from j in Enumerable.Range((int)_count, (int)toGenerate)
select (object)_generator(j);
_count += toGenerate;
return values.ToList<object>();
});
}
然而,我得到线程异常:
异常:应用程序调用了为不同线程编组的接口。(Exception from HRESULT: 0x8001010E (rpce_wrong_thread))
似乎我需要在UI线程上运行这个?但是我不能访问Dispatcher
寻找一些建议
我想你找错地方了。当然,我在黑暗中进行了一些尝试,但由于其余部分看起来无害,因此您的_generator(int)
方法中的某些内容很可能需要在UI线程上运行。(也许它不是UI线程本身,但某些东西需要与其他东西在同一线程上运行。)既然你提到了缩略图,最有可能的原因是你在一个线程中创建了一个GDI+ Graphics对象,并试图在另一个线程中操作它。
我的建议是仔细检查你的_generator(int)
方法,并制作一个async
版本,以确保代码在正确的线程上运行。这样可以保持封装,并且您的LoadMoreItemsOverrideAsync
回调不需要了解_generator
的内部工作原理。
作为附带说明,添加10ms延迟几乎肯定不是正确的操作,除非存在一些您正在积极尝试避免的竞争条件。(评论中的"等待工作"是什么意思?如果您确实在等待工作,那么您不应该等待另一个任务完成,而不是任意的10毫秒吗?
你最有可能得到的警告是试图告诉你,"你已经用async
关键字标记了这个方法,但是它不是异步的。"你是不是把await
忘在什么地方了?"
如果作为最后的手段,您别无选择,只能同步运行代码,那么就这样做。在那里放一个注释,并通过禁用该方法的特定警告来确认这种情况。