.NET Framework 4.7.2截取10秒直播视频时取消操作无文件输出问题
解决直播流下载取消后无输出文件的问题
你的问题核心在于取消操作触发时,代码要么没走到创建文件的步骤,要么流资源没正确处理,导致文件无法生成。具体原因和修复方案如下:
问题根源
- 调用
cts.Cancel()时,HttpClient.GetAsync会立刻抛出OperationCanceledException,如果没捕获这个异常,后续创建文件流、拷贝数据的代码根本不会执行,自然不会生成文件。 - 就算成功进入拷贝阶段,同步的
CopyTo方法不支持取消令牌,取消操作无法中断拷贝;而且如果拷贝中途中断,文件流没正确刷新或释放,已下载的内容也不会写入磁盘。
修复后的代码
CancellationTokenSource cts = new CancellationTokenSource(); // 自动10秒后取消,也可以手动调用cts.Cancel() cts.CancelAfter(TimeSpan.FromSeconds(10)); try { using (var httpClient = new HttpClient()) { var httpResult = await httpClient.GetAsync("http://.....video.flv", cts.Token); httpResult.EnsureSuccessStatusCode(); // 确保请求有效 using (var resultStream = await httpResult.Content.ReadAsStreamAsync()) using (var fileStream = File.Create(saveDir)) { // 用支持取消的异步拷贝方法,传入令牌 await resultStream.CopyToAsync(fileStream, 81920, cts.Token); // 强制刷新到磁盘,避免内容滞留内存 await fileStream.FlushAsync(); } } } catch (OperationCanceledException) { // 取消时如果文件不存在,可创建空文件(按需调整) if (!File.Exists(saveDir)) { using (File.Create(saveDir)) { } } // 这里可以加取消后的自定义逻辑 } catch (Exception ex) { Console.WriteLine($"下载出错:{ex.Message}"); }
关键优化点
- 用
using包裹所有流和HttpClient,确保异常时资源自动释放,不会残留未处理的文件句柄。 - 替换同步
CopyTo为异步CopyToAsync,并传入取消令牌,让取消操作能直接中断拷贝。 - 在取消异常的捕获块中,检查并创建文件(如果需要),保证无论是否取消都有输出文件。
- 手动调用
FlushAsync,确保已下载的片段写入磁盘,避免取消时内容丢失。
内容的提问来源于stack exchange,提问作者uingtea
相关产品推荐
相关产品推荐

