繁体   English   中英

C# 异步文件操作/消除 UI 阻塞

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM