qq_43353945 2023-09-20 18:02 采纳率: 31.3%
浏览 15

C#传输大文件如何保证界面不卡死啊

我用文件流传输1G以上大小的大文件,传输过程不用Application.DoEvents(),如何让界面不卡死,用的winform,用await和async还是会卡

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-20 18:20
    关注

    引用 皆我百晓生 小程序回复内容作答:
    在传输大文件时,为了保证界面不会卡死,可以考虑使用异步操作。在C#中,可以使用asyncawait关键字来实现异步操作。

    以下是一个示例的代码:

    private async Task TransferFileAsync(string sourceFilePath, string destinationFilePath)
    {
        using (FileStream sourceFileStream = new FileStream(sourceFilePath, FileMode.Open))
        using (FileStream destinationFileStream = new FileStream(destinationFilePath, FileMode.Create))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
    
            while ((bytesRead = await sourceFileStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
            {
                await destinationFileStream.WriteAsync(buffer, 0, bytesRead);
                // 更新UI进度条等界面操作可以放在这里
            }
        }
    }
    

    在调用该方法时,可以使用await来等待传输完成:

    await TransferFileAsync(sourceFilePath, destinationFilePath);
    

    通过使用异步操作,传输大文件的过程将会在后台线程进行,而不会阻塞主线程,从而保证界面的响应性。

    注意,你还可以在传输过程中,使用事件或委托进行进度更新等界面操作,而不需要使用Application.DoEvents()

    评论

报告相同问题?

问题事件

  • 修改了问题 9月20日
  • 创建了问题 9月20日

悬赏问题

  • ¥15 短剧的sdk在哪里接入
  • ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
  • ¥60 找人回答kibana8.14.3二次集成开发,自定义插件ui导航栏如何设置
  • ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零
  • ¥15 不同模型怎么用同一个shader
  • ¥15 安卓启动没有ais proxy与v4l2的log打印
  • ¥15 go怎么读取mdb文件里面的数据
  • ¥60 Matlab联合CRUISE仿真编译dll文件报错
  • ¥15 脱敏项目合作,ner需求合作
  • ¥15 脱敏项目合作,ner需求合作