[英]C# async file operations / eliminate UI Blocking
也许我只是看错了-我通常不必编写有进度的 UI...我正在尝试在 WPF 应用程序中使用 .Net 7.0 执行此操作。 我的代码看起来像:
public async void ProcessAllFiles()
{
var fileItemCollection = await GetFilesToProcess(@"\\MyServer\Share");
foreach (var fileItem in fileItemCollection)
{
var result = await ProcessFile(fileItem);
PublishResultsToUI(result);
}
}
public async Task<ResultInfo> ProcessFile(FileInfo item)
{
var result = new ResultInfo();
await Task.Run(() =>
{
// add processing results to result object
....
));
return result;
}
“GetFilesToProcess”锁定 UI 10-15 秒,每个“ProcessFiles”为每个文件锁定 UI 1 秒或 2 秒。
无论有没有 async/await/Task 语句,时间似乎都差不多。
如果 UI 没有每隔几秒就卡住,一切都会很好。
任何想法将不胜感激(我已经阅读了一堆文档,但我只是没有找到对我有意义的)。
谢谢!
答案很简单——重新启动我的系统。 我没有更改任何代码,但我不再有任何冻结的 UI。 @Peter Csala - 感谢提示 - 实际代码是异步任务,我的伪代码只是没有反映出来。
不过,应该如何处理? 假设我做了类似的事情(伪代码,完全未经语法或功能测试):
public async Task CopyFileIfNewer(string source, string target)
{
FileInfo SourceFile = new FileInfo(source);
FileInfo TargetFile = new FileInfo(target);
if (TargetFile.Exists)
{
if (SourceFile.LastWriteTime > TargetFile.LastWriteTime)
{
// perhaps update the UI
Status = $"Copying {source}...";
// wait for the background task to complete
await Task.Run(() =>
{
SourceFile.CopyTo(Destination, true);
});
// update UI if needed
Status = $"Copied {source}.";
}
}
}
假设语法和逻辑是正确的,以上是否会导致 UI 阻塞?如果应该,那么不阻塞 UI 的正确方法是什么?
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.