我面对一个奇怪的情况。首先,让我们看一下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秒,为什么按钮不退回?