异步任务执行顺序异常引发重复下载文件报错问题排查
WPF异步下载文件重复执行导致文件占用异常的原因
核心原因1:Loaded事件被多次触发
WPF的Loaded事件并非只会执行一次——当窗口发生视觉树变更(比如控件重新渲染、窗口尺寸调整、内容动态更新),或者窗口被隐藏后重新显示时,该事件可能被重复触发。如果你的LoadingWindow_Loaded是async void类型的事件处理方法,每次触发都会启动一个新的异步循环,多个循环同时去下载同一个文件,自然会导致多个流同时占用本地文件,抛出异常。
核心原因2:async void的异步处理特性
WPF事件处理程序通常用async void(因为事件委托要求返回void),当方法执行到await blobClient.DownloadToAsync(fs)时,会立即释放UI线程返回,直到异步下载完成后,剩余代码才会在UI线程继续执行。如果此时Loaded事件再次触发,新的异步调用会和之前未完成的调用并行执行,多个任务同时操作同一个本地文件,引发占用冲突。
核心原因3:缺少并发控制逻辑
如果你的循环调用DownloadFileStdAsync时,没有检查当前是否已有相同文件的下载任务在运行,也没有加锁或使用任务管理机制来避免并发操作同一份文件,那么只要有多个异步任务同时执行到打开文件流的步骤,就会触发文件被占用的异常。
内容的提问来源于stack exchange,提问作者federico
相关产品推荐
相关产品推荐

