gpt4 book ai didi

c# - 在运行时发送长进程的当前状态

转载 作者:行者123 更新时间:2023-12-05 05:46:51 25 4
gpt4 key购买 nike

我想知道 ASP.NET C# 中是否有一种方法可以以某种方式向用户表明工作仍在进行,同时执行需要很长时间才能结束的内容。

让我用一些代码来解释一下。首先,我有一个显示一些 fileUpload 项目的 ASPX 页面和一个将表单发送到服务器的按钮。它允许用户发送 3 个不同的文件,每个文件的处理方式不同:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="MassUpdates.aspx.cs" Inherits="MassUpdates" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<h3 style="font: bold;">Mass Updates</h3>
<hr />
<div class="row">
<div class="col-12 mb-2">
<asp:Label ID="Label0" runat="server" Text="File 1 : "></asp:Label>
<asp:FileUpload ID="fup1" runat="server" />
</div>
<div class="col-12 mt-2 mb-2">
<asp:Label ID="Label1" runat="server" Text="File 2 : "></asp:Label>
<asp:FileUpload ID="fup2" runat="server" />
</div>
<div class="col-12 mt-2 mb-2">
<asp:Label ID="Label2" runat="server" Text="File 3 : "></asp:Label>
<asp:FileUpload ID="fup3" runat="server" />
</div>
</div>
<div class="row">
<div class="col-12 mt-2">
<asp:Button ID="btnEnvoi" runat="server" Text="Envoyer" OnClick="btnEnvoi_Click" />
</div>
<div class="col-12 mt-2">
<asp:Label ID="lblMsg" runat="server" Text="" Visible="false"></asp:Label>
</div>
</div>
</asp:Content>

然后,在代码隐藏页面上,我有一个小函数,当用户按下按钮时调用每个文件进程,如果文件已被删除:

protected void btnSend_Click(object sender, EventArgs e)
{
if (fup1.HasFiles)
{
result += trtFile1(); // Return a string that give the final feedback of the execution for File 1
}

if (fup2.HasFiles)
{
result += trtFile2(); // Return a string that give the final feedback of the execution for File 2
}

if (fup3.HasFiles)
{
result += trtFile3(); // Return a string that give the final feedback of the execution for File 3
}

lblMsg.Text = result;
}

但正如我之前所说,如果用户发送 3 个大文件,完成所有过程需要数年时间(这是一张图片),他们想知道应用程序是否崩溃或仍在运行。

我想知道的是,当我们到达函数的某个步骤时,是否有一种方法可以向客户端页面发送一些信息(例如要在进度条中设置的文本或值)。类似的东西:

protected void btnSend_Click(object sender, EventArgs e)
{
if (fup1.HasFiles)
{
// Send to the client that we start file 1
result += trtFile1(); // Return a string that give the final feedback of the execution for File 1
}

if (fup2.HasFiles)
{
// Send to the client that we start file 2
result += trtFile2(); // Return a string that give the final feedback of the execution for File 2
}

if (fup3.HasFiles)
{
// Send to the client that we start file 3
result += trtFile3(); // Return a string that give the final feedback of the execution for File 3
}

lblMsg.Text = result;
}

如果你们中的任何人已经听说过这种功能或口袋里有类似的东西,谢谢!

Rolstyam.

最佳答案

我这样做的方式是:

  1. 客户端发出请求,包括一个 Guid 作为进度报告的 key
  2. 服务器开始处理,并使用 Guid 作为键定期更新一些共享数据结构。
  3. 客户端使用计时器定期轮询服务器以获取进度,再次使用 guid 作为键。
  4. 当服务器完成处理时,它应该从共享存储中删除 guid 以防止任何内存泄漏。

我不知道这是否是“正确”的方法,只是它对我的目的来说效果很好,即应用程序后端执行处理密集型工作。如果有更好的方法,我希望有人能发布它。如果下载数据是主要瓶颈,我不知道它的适用性如何,也不知道用于网页会有多困难。

关于c# - 在运行时发送长进程的当前状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71114059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com