【发布时间】:2015-11-06 17:49:19
【问题描述】:
我的应用程序以图形方式可视化非常大的文件。用户可以放大并使用滚动条在其上移动。因为访问文件内容会导致 UI 延迟和惹恼用户,文件访问需要从单独的线程完成。
案例:用户移动滚动条:
- 线程(每次都启动一个新线程?)必须在后台加载数据以更新新滚动条位置的视图
- 如果先前的请求正在进行中:必须取消
- 加载数据后,必须将结果返回给 UI 以供显示
对于文件访问,我将使用MemoryMappedFile 类。也许它是线程安全的,但我认为在开始新的读取操作之前最好完全停止以前的读取操作(无重叠,顺序)。
我正在考虑使用CancellationTokenSources 取消请求。但是滚动条会产生很多事件。我们是否应该在短时间内new 并取消数十或数百个CancellationTokenSources? (频繁启动/取消)
即使使用线程池,启动线程也会产生开销。所以最好准备好一个线程,等待发布到它的工作。 Dispatcher?
BackgroundWorker 如果每次都开始一个新的,可能会出现重叠问题。但这就是它应该被使用的方式......
'async' 'await' :我听说这对 IO 非常有用,但我在 .NET 4.0 上,所以它不适合我。
所以现在我想用Thread 和Dispatcher 和CancellationTokenSource 来取消请求。但也许有更好的方法?
【问题讨论】:
-
你见过微软的 bcl.async 包吗?它允许您从 .net 4.0 使用异步和等待。我已经在生产代码中使用了它,它对我来说是可靠的。有一个 nuget:link 一些警告——在 .net 4.5 中添加到 Task 的静态辅助方法丢失了,但 Task.Factory.StartNew() 完成了工作。
标签: c# wpf multithreading io .net-4.0