我有一种情况,我需要在UI线程上一个接一个地处理大量文件,每个文件的加载和处理都可能需要大量的时间,并且它们一起使用太多的内存,一次加载太多.这些都是在.NET4.8应用程序中运行的,不幸的是,在同步的代码库的一部分中运行.
从本质上讲,我的代码如下所示:
IEnumerable<ScanFile> stream = GetScanFileStream();
foreach (ScanFile scanFile in scanFiles)
{
Process(scanFile); // Requires to be called on the UI thread
}
IEnumerable<ScanFile> GetScanFileStream() =>
from filePath in Directory.EnumerateFiles("c:\\scans", "*.json")
select this.LoadScanFile(filePath); // I like to run this in the background
}
执行LoadScanFile
的时间大致相当于执行Process
的时间,因此,我希望通过在操作仍在UI线程上运行的同时在后台线程上预加载下一个文件,将处理这些文件所需的时间减少一半.
我试图创建一个特殊的IEnumerable<T>
修饰符实现,包装允许这种行为的原始流,但我很快发现实现变得太复杂了.我开始使用信号量在线程之间进行同步.就在那时,我不再追求这个解决方案,认为应该有更简单的解决方案,具有同样的效果.
我本以为可以通过使用LINQ来并行使用BCL和CLR中内置的构造来实现这种行为,但在谷歌上进行广泛搜索并没有得到任何好的结果.
您有什么建议的解决方案可以让我将处理时间减半?