Имена файлов берутся из BlockingCollection, а двоичное содержимое кэшируется в словаре.
(Объект прогресса помогает мне отслеживать прогресс, но это не имеет отношения к данному вопросу)
Моя текущая реализация использует System.Reactive:
Код: Выделить всё
private static Task PreloadBinariesAsync(BlockingCollection inputs, int mdop, ConcurrentDictionary binaries, Progress progress) => inputs
.GetConsumingEnumerable()
.Select(p => Observable.FromAsync(() => ReadAllBytesAsync(p.TargetPath)))
.Merge(mdop, ThreadPoolScheduler.Instance)
.ForEachAsync(o =>
{
progress.IncAsmFileCachedCount();
binaries[o.FilePath] = o.Bytes;
});
private static async Task ReadAllBytesAsync(string filePath) => (filePath, await FS.ReadAllBytesAsync(filePath).ConfigureAwait(false));
Я очень открыт для лучшие альтернативы, при необходимости я могу изменить BlockingCollection на Channel или что-то еще, но оно должно быть частью шины Consumer/Producer.
P.S.
P.S.
К сожалению, я ограничен использованием .NET Framework.
Подробнее здесь: https://stackoverflow.com/questions/792 ... y-while-no