使用异步任务更新更新面板ASP.NET C#

时间:2014-09-17 08:52:35

标签: c# asp.net webforms updatepanel task

我一直在使用ASP.NET Web表单中的Tasks,目的是为UI提供更详细的流程反馈。我的目标是实现以下目标:

  • 用户点击按钮即可执行操作。
  • 按钮单击事件启动任务以异步方式运行
  • 然后,任务将其进度转发到UI中的标签,直到完成

我知道我可以使用进度条控件来实现类似的功能但是我很想知道是否可以通过这种方式实现它。我的测试代码如下:

Aspx前端片段:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Timer ID="Timer1" runat="server" Interval="500" OnTick="Timer1_Tick"></asp:Timer> 
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
<Triggers>
    <asp:AsyncPostBackTrigger ControlID="Button1" />
    <asp:AsyncPostBackTrigger ControlID="Timer1" />
</Triggers>

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Push Me"/>

这个想法是计时器会导致异步回发,这会将任务进度的状态输出到标签。

Aspx.cs片段

我将使用静态变量进行测试,任务将定期更新。

public static int testing;

protected void Button1_Click(object sender, EventArgs e) {
    //Initialise static
    testing = 0;

    var progress = new Progress<int>(ProgressReport);
    Task t = new Task(() => Test(progress));
    t.Start();
 } 

public void ProgressReport(int progress)
{
    //Update the static with the current progress value
    testing = progress;            
}

public void Test(IProgress<int> progress)
{
    for (int i = 0; i < 10; i++)
    {
        //Pretend to do something intensive
        Thread.Sleep(1000);
        //Output the progress
        progress.Report(i);
    }
}

protected void Timer1_Tick(object sender, EventArgs e)
{
    //Output the value of the static to the label
    Label1.Text = testing.ToString();
}

尽管正确触发了ReportProgress方法并更新了静态变量,并且正确触发了计时器事件方法,但更新面板中的标签在任务完成之前不会更新并显示值9.

我在过去使用类似方法取得了成功,其中任务将进度值存储在数据库中,并且只需检索计时器tick事件并将其显示在标签上。但是我很好奇,看看是否有可能在没有在数据库中存储进度值的情况下实现相同的结果。

我非常感谢有关此问题的任何帮助或建议,并提前感谢:)

0 个答案:

没有答案