【问题标题】:Issue with asynchronously removing displayed data异步删除显示数据的问题
【发布时间】:2023-03-17 14:03:01
【问题描述】:

我正在使用以下代码进行测试以显示数据,然后在一段时间后使用异步将其删除。

我遇到的问题是我想显示标签和文本,然后执行异步但是异步在我的代码的第一部分之前运行。

有没有一种方法可以让我先运行代码然后执行异步等待?

<form id="form1" ondatabound="Page_Load()" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label" Visible="false"></asp:Label><br /><br />
        <asp:Button ID="Button1" class="btn btn-error" OnClick="Button1_Click" runat="server" Text="Button" /><br /><br />
        <asp:TextBox ID="TextBox1" ReadOnly="false" Text="" Visible="true" runat="server"></asp:TextBox><br /><br />
        <asp:TextBox ID="TextBox2" ReadOnly="false" Text="" Visible="true" runat="server"></asp:TextBox><br />
    </div>
</form>
public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //TextBox1.Text = "TestEmail";
        //TextBox2.Text = "TestPassword";
    }

    //When Button1 is clicked then show/hide the title label
    protected void Button1_Click (object sender, EventArgs e)
    {
        if (Label1.Visible == false)
        {
            Label1.Visible = true;
            Label1.Text = "Please use this link to login: www.test.com";
            TextBox1.Text = "TestingData";
        }
        else
            Label1.Visible = false;
        ClearMessages();
    }

    public async Task SyncTest()
    {
        await Task.Delay(5000); // 5 second delay
        this.ClearMessages();
    }

    protected void ClearMessages()
    {
        TextBox1.Text = "";
        TextBox2.Text = "";
        Label1.Text = "";
    }
}

【问题讨论】:

  • 如果你使用 await 线程会等待方法被执行然后继续。但是,如果页面已呈现并传递给客户端,我不确定您是否仍然可以传递信息。您可以通过在 5 秒后调用脚本进行清理来解决此客户端问题。
  • 我认为您应该查看客户端代码 (JavaScript) 以显示/隐藏文本。您的 asp.net 代码在服务器上运行!
  • 您似乎认为 async/await 将使您能够更改浏览器中已呈现的页面。它不会,有 javascript 。
  • 您可以使用 ViewState 和 StateManager (ajax) 执行此操作,但我不确定这样的考虑是否真的与任务和异步有关.. 因为 XHR 调用和机制本质上是异步方面。
  • 感谢你们的cmets,这极大地增进了我的理解。

标签: c# asp.net webforms async-await


【解决方案1】:

关于你的概念和问题:

...在一定时间后删除[数据],使用async [,或等待的Task]。

有没有办法让我能够[渲染页面]然后执行asyncawait

据我所知,没有框架支持 async awaitTask 跨越 Page Lifecycles,更不用说在后渲染/卸载页面上编写机制了,所以答案很可能,没有


但是,ASP.NET AJAX Extensions 对 WebForm 应用程序有异步支持。您可以使用Partial Page Updates 实现您想要的行为(以异步方式处理控件属性更改的代码)。

【讨论】:

    【解决方案2】:

    正如我在评论中提到的。一旦页面被渲染,后端就不再与页面连接,因此它不能清空文本。解决这个问题的更好方法是通过在客户端调用脚本来清理它

    Page.ClientScript.RegisterStartupScript(GetType(), "cleanText", "cleanText());", true);
    

    这将调用下面的方法,该方法将在 5 秒后清空 textbox1。

    function cleanText(){
       setTimeout(function() { 
       var txt1 = document.getElementById('<%= TextBox1.ClientID %>');
       txt1.value = "";}, 5000);
    }
    

    【讨论】:

    • 感谢您的帮助和反馈,非常感谢。我从中学到了很多东西,并将研究和实现上述代码。
    • 这个答案是信息丰富的,并且与 OP 的预期结果以及问题的一个方面有关,但实际上并没有回答问题或反映 OP 的期望实现:这是有一个可以处理控制视图状态的异步(回调)。您也可以在 ScriptManager 中使用注册脚本进行部分页面更新:docs.microsoft.com/en-us/dotnet/api/… 确实支持这些注意事项。
    • 当然,添加 xhr 回调和部分页面更新在时间上不太准确 - 这当然是一个考虑因素;这个答案的实现在时间上更可靠。
    • @BrettCaswell 我对您的评论有点困惑,因为您链接到我提供的相同解决方案,但仍然说这不是可行的方法。你能提供一个更好的答案吗,谢谢
    • 我知道它在哪里令人困惑,我没有将您链接到相同的解决方案。我链接的方法是ScriptManager 的方法,您上面引用的方法是ClientScriptManager 的方法,您可以在我提供的链接的备注部分看到它们不同,服务不同目的。 "如果您想注册一个与部分页面更新无关的启动脚本,并且如果您只想在初始页面渲染期间注册一次脚本,请使用 ClientScriptManager 类的 RegisterStartupScript 方法"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-12-31
    相关资源
    最近更新 更多