gpt4 book ai didi

wpf - 我应该在UI Thread或Task.Run上使用async等待来处理多个文件吗?

转载 作者:行者123 更新时间:2023-12-03 13:20:43 24 4
gpt4 key购买 nike

我正在使用.NET 4.5在WPF中编写应用程序。该应用程序允许用户选择多个文件并将其导入。发生这种情况时,应用程序将解析文本文件并将数据存储到数据库中。这些文件可能很大,因此我希望UI保持响应状态,并允许用户在发生这种情况时做其他事情。

我是异步编程的新手,想知道最好的方法是什么?根据Microsoft article ...

"The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active. You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available."



由于我正在处理多个文件,因此我会为每个文件使用“Task.Run”更好,因为它们将在单独的线程上运行?如果没有,使用async/await在同一线程上运行所有内容有什么好处?

请注意,没有其他UI操作(进度条-进度报告除外)真正关心这些文件何时完成处理,因此根据本文看来,使用Task.Run会使我受益。你觉得呢?你有没有什么想法?

最佳答案

您正在处理这些文件吗?如果您要进行CPU密集型工作,最好将处理移出UI线程。如果真的只是要作为IO,那么您可以在UI线程中完成所有操作-仍然使其并行。

例如:

private async Task ProcessAllFiles(IEnumerable<string> files)
{
List<Task> tasks = files.Select(x => ProcessFile(x))
.ToList();
await Task.WhenAll(tasks);
textBox.Text = "Finished!";
}

private async Task ProcessFile(string file)
{
// Do stuff here with async IO, and update the UI if you want to...
}

在这里,您仍在执行UI线程上的所有实际处理-除了潜在的IO完成端口之外,没有单独的线程在运行-但您仍在同时启动多个异步IO操作。

现在要考虑的另一件事是,这实际上可能会减慢一切。如果要在同一物理磁盘上处理多个文件,则可能会发现由于磁盘IO的性质,顺序访问它们会更快。但是,这将取决于磁盘类型(例如,SSD的行为与“常规”磁盘不同)。

关于wpf - 我应该在UI Thread或Task.Run上使用async等待来处理多个文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com