如何使异步sendFile操作等待全部writeToFile任务执行完毕?
解决异步写入完成后再执行上传的问题
这问题我太熟了,核心就是要确保所有异步写入任务全部完成后,再触发文件上传操作,给你两个简单可行的方案:
方案1:收集所有写入任务,统一等待执行
当你需要多次调用writeToFile时,别直接逐个await单个任务,而是把每个writeToFile返回的Task都收集到一个集合里,等所有写入调用都发起后,用Task.WhenAll()等待所有任务完成,再启动上传。
示例代码:
// 第一步:收集所有写入任务 var writeTasks = new List<Task>(); writeTasks.Add(writeToFile("第一份数据")); writeTasks.Add(writeToFile("第二份数据")); writeTasks.Add(writeToFile("第三份数据")); // 可以继续添加更多写入任务... // 第二步:等待所有写入操作完成 await Task.WhenAll(writeTasks); // 第三步:所有写入完成后,执行上传 await sendFile(); // 注:原代码里sendFile的string data参数没用到,建议检查是否是笔误
这个思路最直接,能保证上传操作只会在所有写入任务都结束后才开始,完全避免了提前执行上传的问题。
方案2:封装批量写入方法(更优雅的批量场景)
如果你的写入操作是批量触发的,可以把收集任务+等待的逻辑封装成一个单独的方法,让代码更整洁:
// 封装批量写入方法 private static async Task BatchWriteToFiles(IEnumerable<string> dataList) { // 把所有数据对应的写入任务转换成集合 var writeTasks = dataList.Select(data => writeToFile(data)); // 等待全部完成 await Task.WhenAll(writeTasks); } // 调用时的写法 var dataToWrite = new List<string>{"数据1", "数据2", "数据3"}; await BatchWriteToFiles(dataToWrite); await sendFile();
额外提醒
- 原代码里
sendFile的参数string data在方法内部没有被使用,建议检查是否是多余参数,可以考虑移除。 - UWP的
FileIO.AppendTextAsync本身是线程安全的,多个异步写入请求会被系统排队处理,但Task.WhenAll的等待逻辑依然必要——它能明确告诉程序:必须等所有写入都结束,才能开始上传。
内容的提问来源于stack exchange,提问作者krckumar
相关产品推荐
相关产品推荐

