【问题标题】:Incrementally loading items in a listview在列表视图中增量加载项目
【发布时间】:2015-05-29 04:26:49
【问题描述】:

我采用了来自 MSDN 的以下示例,用于在 WinRT 应用的列表视图中增量加载缩略图:

https://code.msdn.microsoft.com/windowsapps/Data-Binding-7b1d67b5

我想删除下面的“await Task.Delay(10)”行。 当我这样做时,我会收到一条警告,指出该方法缺少等待运算符。

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>();
            });
}

但是,我遇到了线程异常:

异常:应用程序调用了为不同线程编组的接口。 (来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))

看来我需要在 UI 线程上运行它?但我无权访问 Dispatcher。

寻找一些建议

【问题讨论】:

  • Control上没有Invoke(delegate)方法吗?

标签: c# winrt-xaml winrt-async


【解决方案1】:

我认为你找错地方了。诚然,我在黑暗中采取了一些措施,但由于其余部分看起来无害,您的 _generator(int) 方法中的某些内容很可能需要在 UI 线程上运行。 (也许它不是 UI 线程本身,但某些东西需要与其他东西在同一个线程上运行。由于您提到缩略图,最可能的原因是您创建了一个 GDI+ 图形对象一个线程并试图在另一个线程中对其进行操作。)

我的建议是仔细检查您的_generator(int) 方法并制作它的async 版本,以确保代码在正确的线程上运行。这种方式保持封装,您的LoadMoreItemsOverrideAsync 回调不需要了解_generator 的内部工作原理。


附带说明一下,添加 10 毫秒延迟几乎绝对不是正确的操作,除非您正在积极尝试避免某些竞争条件。 (评论中的“等待工作”是什么意思?如果您确实在等待工作,您不应该等待另一个任务完成,而不是任意10ms吗?)

您最有可能收到的警告是试图告诉您,“您已使用 async 关键字标记了此方法,但没有任何关于它是异步的。您是否在某处忘记了 await?”

如果您别无选择,只能同步运行代码,那就这样做吧。在那里发表评论,并通过禁用该方法的特定警告来确认情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多