У меня есть этот рекурсивный метод copyFolder, который копирует (исходные измененные) файлы/подпапки параллельно.Параллельное или последовательное копирование файлов в WinRT
copyFileIfNewerAsync = function(sourceFile, destFolder) {
return destFolder.tryGetItemAsync(sourceFile.name).then(function(destFile) {
if (destFile) {
return WinJS.Promise.join({
sourceProperties: sourceFile.getBasicPropertiesAsync(),
destProperties: destFile.getBasicPropertiesAsync()
}).then(function(_arg) {
var destProperties, sourceProperties;
sourceProperties = _arg.sourceProperties, destProperties = _arg.destProperties;
if (sourceProperties.size !== destProperties.size && sourceProperties.dateModified > destProperties.dateModified) {
logger.debug("Updating " + destFolder.path + "\\" + destFile.name);
return sourceFile.copyAsync(destFolder, sourceFile.name, NameCollisionOption.replaceExisting);
} else {
return logger.trace("" + destFolder.path + "\\" + destFile.name + " up-to-date (" + destProperties.dateModified + ")");
}
});
} else {
logger.debug("Copying " + sourceFile.name + " to " + destFolder.path);
return sourceFile.copyAsync(destFolder, sourceFile.name, NameCollisionOption.replaceExisting);
}
});
};
copyFolderAsync = function(destFolder, sourceFolder) {
return destFolder.createFolderAsync(sourceFolder.name, CreationCollisionOption.openIfExists).then(function(destSubFolder) {
return sourceFolder.getItemsAsync().then(function(items) {
return WinJS.Promise.join(items.map(function(item) {
if (item instanceof Windows.Storage.StorageFile) {
return copyFileIfNewerAsync(item, destSubFolder);
} else {
return copyFolderAsync(destSubFolder, item);
}
}));
});
});
};
Кажется, что это очень усиливает систему. Может быть, последовательный подход к копированию будет менее напряженным для системы и, в конце концов, еще быстрее?
Если да, как бы мне пришлось реорганизовать код, чтобы он запускался последовательно?
обновление
о WinJS.Scheduler
preloadAsync = (serialNumbers, expert) ->
assert(expert)
assert(serialNumbers)
serialNumbers = [serialNumbers] unless Array.isArray(serialNumbers)
preloadPromise?.cancel()
preloadPromise = serialNumbers.reduce((p, serialNumber) ->
p.then(WinJS.Utilities.Scheduler.schedulePromiseBelowNormal)
.then() ->
preloadOneAsync(serialNumber, expert)
.then null, (error) ->
if error.name isnt "Canceled"
logger.error("Could not create preloaded inspection #{serialNumber}", error)
, WinJS.Promise.as())
Это должно затем запланировать все загрузки при низкой ПРИО?
Благодаря Kraig. Попробуй и вернись сюда. – philk
Kraig переплетается в течение некоторого времени, чтобы действительно копировать файлы во время простоя UI, я мог бы использовать WinJS.Utilities.Scheduler.schedulePromiseBelowNormal? – philk
Да, я проверил с людьми в Windows и обнаружил, что асинхронные вызовы WinRT, порожденные в обратном вызове с более низким приоритетом, также будут работать с более низким приоритетом. (С технической точки зрения, они наследуют приоритет CoreDispatcher этого обратного вызова JS.) Поэтому использование планировщика для запуска на холостом ходу должно препятствовать возникновению проблем с пользовательским интерфейсом. –