基于.NET 9实现实时进度条功能:前后端完整示例教程

要在基于.NET 9的应用中实现进度条功能,我们可以通过HttpContext.Response来发送实时的进度更新到前端。以下是一个简单的示例,展示了如何在ASP.NET Core应用中实现这一功能。

但是,我在.net framework4.7.2框架下,实际不了HttpContext.Response.WriteAsync,发贴求解决办法

后端代码(C#)

首先,我们需要创建一个ASP.NET Core控制器动作,该动作将模拟一个长时间运行的任务,并在任务执行过程中发送进度更新。

cs 复制代码
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading;
using System.Threading.Tasks;
[ApiController]
[Route("[controller]")]
public class ProgressController : ControllerBase
{
    [HttpGet("start")]
    public async Task StartLongRunningTask()
    {
        // 设置响应头,指示这是一个长时间运行的请求
        HttpContext.Response.Headers.Add("Connection", "keep-alive");
        HttpContext.Response.Headers.Add("Content-Type", "text/event-stream");
        HttpContext.Response.Headers.Add("Cache-Control", "no-cache");
        // 模拟长时间运行的任务
        for (int i = 0; i <= 100; i++)
        {
            // 发送进度更新
            await SendProgress(i);
            // 模拟工作负载
            await Task.Delay(100);
        }
        // 任务完成,关闭连接
        await HttpContext.Response.Body.FlushAsync();
        HttpContext.Response.Body.Close();
    }
    private async Task SendProgress(int percentage)
    {
        var data = $"data: {percentage}\n\n";
        var bytes = System.Text.Encoding.UTF8.GetBytes(data);
        await HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
        await HttpContext.Response.Body.FlushAsync();
    }
}

二、前端代码(HTML + JavaScript)

接下来,我们需要创建一个简单的HTML页面,用于显示进度条,并使用JavaScript来接收后端发送的进度更新。

cs 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Progress Bar Example</title>
    <style>
        #progressBar {
            width: 0%;
            height: 30px;
            background-color: green;
            text-align: center;
            line-height: 30px;
            color: white;
        }
    </style>
</head>
<body>
    <div id="progressBar">0%</div>
    <button onclick="startProgress()">Start Task</button>
    <script>
        function startProgress() {
            const eventSource = new EventSource('/Progress/start');
            eventSource.onmessage = function(event) {
                const progressBar = document.getElementById('progressBar');
                progressBar.style.width = event.data + '%';
                progressBar.textContent = event.data + '%';
            };
            eventSource.onerror = function() {
                eventSource.close();
                console.error('EventSource failed.');
            };
        }
    </script>
</body>
</html>
相关推荐
2601_9620725514 小时前
李梦娇常识4600问|题库|打印版
sql·华为od·华为·c#·华为云·.net·harmonyos
步步为营DotNet1 天前
基于.NET Aspire 实现云原生应用的高效监控与可观测性
云原生·.net·wpf
咸鱼翻身小阿橙1 天前
VS2008 + .NET3.5 环境、加热台TCP通讯场景
tcp/ip·php·.net
tonydf2 天前
DotNet项目接入Copilot SDK简单案例
后端·.net·github copilot
ABprogramming2 天前
Aspire入门指南
c#·.net
User_芊芊君子2 天前
鸿蒙PC适配:Pinta GTK 图像编辑器鸿蒙 PC ArkWeb 适配全记录:从 .NET_GTK4 桌面到 HarmonyOS PC HAP
编辑器·.net·harmonyos
ServBay2 天前
你跟高级 C# 工程师的区别,就是这8个开发技巧
后端·c#·.net
小满Autumn3 天前
log4net 日志框架 — 从配置到实战速查手册
笔记·c#·.net·wpf·上位机·log4net
ceclar1234 天前
C# 的任务并行库(TPL)
开发语言·c#·.net