递归异步函数是否会在UI线程运行?Task.Run实现咨询
关于Task.Run在递归文件处理场景中的实现疑问
我对Task.Run的实现存在疑问,已查阅相关讨论,需针对自身场景进行确认。以下是我的代码概要:
public class MyClass { public async Task<object> Start(string arg1, string arg2) { object result; if (someCondition) result = await OtherClass.Task(arg1, arg2); // 这部分没问题 else result = await Run(arg1, arg2); // 这里是我关注的点 // 清理操作 return result; } private async Task<object> Run(string arg1, string arg2) { // 参数验证(同步代码块) var resultsBuilder = new ResultsBuilder(); await Dig(MyDir); var result = resultsBuilder.GetResults(); // 清理逻辑 return result; } private async Task Dig(DirectoryInfo dir) { foreach (var file in dir.GetFiles()) // 这里也拿不准哪种方式更适合当前场景? // file.Move() await Task.Run(() => file.Move()); foreach (var subDir in dir.GetDirectories()) await Dig(subDir); } }
如代码所示,Dig()方法内使用foreach循环,本质是同步逻辑,递归调用时会等待所有子目录处理完成才退出。我认为即便用了await,这仍是同步代码。
该代码将从UI线程启动,我不希望阻塞UI线程。我有几个疑问:
- 我的理解是当前每个await都会回到初始调用线程(即UI线程),是否正确?
- 仅在
Run()方法中使用.ConfigureAwait(false)是否足够?是否也需要在递归的Dig()方法中使用?或者应该直接用Task.Run(() => Run(arg1, arg2))? - 将递归方法改为无返回值的同步方法,再用Task.Run包裹是否合理?(此时
File.Move()可保持同步,因已在后台线程运行)示例:
await Task.Run(() => Dig(MyDir)); private void Dig(DirectoryInfo dir){ }
内容的提问来源于stack exchange,提问作者RFBomb
相关产品推荐
相关产品推荐

