经过长时间的异步处理,Button不会回发

时间:2018-11-24 00:15:17

标签: asynchronous button postback

我面对一个奇怪的情况。首先,让我们看一下ASP.NET Web窗体中的一个简单示例:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
            <asp:Button ID="testButton" runat="server" Text="Run" OnClick="testButton_Click" />
    </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
    <ProgressTemplate>
        Loading...
    </ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
    <ContentTemplate>
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="testButton" EventName="Click" />
    </Triggers>

public partial class About : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected async void testButton_Click(object sender, EventArgs e)
    {
        Task<string>[] List = new Task<string>[]
        {
            RunLong1(),
            RunLong2()
        };

        string[] responses = await Task.WhenAll(List);

        Label1.Text = responses[0] + " " + responses[1];
    }

    private async Task<string> RunLong1()
    {
        await Task.Run(() =>
        {
            System.Threading.Thread.Sleep(100000);
        });
        return "finished the async task 1";
    }

    private async Task<string> RunLong2()
    {
        await Task.Run(() =>
        {
            System.Threading.Thread.Sleep(60000);
        });
        return "finished the async task 1";
    }

}

因此,我在链接到UpdateProgress面板的更新面板中有一个按钮。单击该按钮时,将触发UpdateProgress面板,并出现“正在加载”字样。此外,同一按钮是另一个更新面板的触发器,在该面板上发布结果。当我单击按钮时,两个异步方法开始在并行模式下运行。他们完成任务后,将显示一条消息。

这是奇怪的事情。如果其中一种异步方法的运行时间超过100,000毫秒,则该按钮不会回发。 “加载”一词永远存在!如果异步方法的持续时间少于100,000毫秒,那么当我单击按钮时,它将同时运行RunLong1和RunLong2异步方法,并且当所有方法都完成后,updatePanel2内部的label1将显示文本,并且单词“ loading”消失。

为什么会这样?如果其中一种异步方法持续时间超过100秒,为什么按钮不退回?

0 个答案:

没有答案