You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework 4.7.2截取10秒直播视频时取消操作无文件输出问题

解决直播流下载取消后无输出文件的问题

你的问题核心在于取消操作触发时,代码要么没走到创建文件的步骤,要么流资源没正确处理,导致文件无法生成。具体原因和修复方案如下:

问题根源

  1. 调用cts.Cancel()时,HttpClient.GetAsync会立刻抛出OperationCanceledException,如果没捕获这个异常,后续创建文件流、拷贝数据的代码根本不会执行,自然不会生成文件。
  2. 就算成功进入拷贝阶段,同步的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:55:08