9

我需要执行一个后台任务,该任务有一个显示完成百分比的进度条和一个取消按钮。撇开任务细节不谈,现在我只想让一个示例正常工作,所以我只有三个主要事件处理程序(DoWork、ProgressChanged 和 RunWorkerCompleted)和一个循环,它只增加一个计数器并在 DoWork 中休眠 50 毫秒。但是,除了最后一次之外,它不会更新。

在 Windows 窗体中,我使用后台工作程序,它可以正常运行,没有任何问题。我想只使用相同的代码。但是,我一直看到说 ASP.NET 必须使用 AJAX 才能获得相同的功能。所以我的问题是:

1) 我真的需要 AJAX 来使用后台工作者吗?

2)如果是的话,我确实需要 AJAX,对于一个不了解 AJAX 的人来说,让后台工作人员启动并在 ASP.NET 网页上运行的最简单、最简单的方法是什么?

3)如果没有,我不需要 AJAX,谁能指出我不使用它的工作示例?即使它使用后台工作人员以外的其他线程方法,我也很感兴趣。

对不起,多部分的问题!如果您能回答其中之一,将不胜感激。我真的不介意我最终使用哪种方法,只要它有效。

来自 .cs 页面的参考代码:

 protected void bwProcess_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 { 
     lblProgress.Text = "Task Complete: " + e.Result;
 }

 protected void bwProcess_ProgressChanged(object sender, ProgressChangedEventArgs e)
 {
     lblProgress.Text = e.ProgressPercentage.ToString();
 }

 protected void bwProcess_DoWork(object sender, DoWorkEventArgs e)
 {
     for (int i = 0; i <= 100; i++)
     {
         if (bwProcess.CancellationPending)
         {
             lblProgress.Text = "Task Cancelled.";
             e.Cancel = true;
             return;
         }
         bwProcess.ReportProgress(i);
         Thread.Sleep(50);
     }
     e.Result = "100%";
}

protected void BWClick(object sender, EventArgs e)
{
    lblProgress.Text = "Firing Process...";
    bwProcess = new BackgroundWorker();
    bwProcess.WorkerReportsProgress = true;
    bwProcess.WorkerSupportsCancellation = true;
    bwProcess.DoWork += new DoWorkEventHandler(bwProcess_DoWork);
    bwProcess.ProgressChanged += new ProgressChangedEventHandler(bwProcess_ProgressChanged);
    bwProcess.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwProcess_RunWorkerCompleted);

    if (bwProcess != null)
    {
        bwProcess.RunWorkerAsync("StartAsynchronousProcess");
    }
}

其他注意事项:我在@Page 中输入了 Async="True" 和 EnableSessionState="ReadOnly"。

提前致谢!

4

1 回答 1

7

Web 编程提供了许多挑战,这些挑战在桌面编程时很容易被认为是理所当然的。从一个移动到另一个可能需要进行大量更改。产生长时间运行的线程是需要更加小心以避免陷阱的事情之一。应用程序池不知道您生成的线程,因此当它回收时,它会杀死那些导致应用程序出现意外行为的线程。有关更多信息,请参阅这篇文章,我可以使用线程在 IIS 上执行长时间运行的作业吗?

这意味着您需要使用更持久的方式来跟踪进度。数据库可能是最好的,但即使是文件也会在池回收后保留。


AJAX 将是完美的,因为它允许您在后台异步地从数据库中提取进度并更新网页。这是您如何实现此目标的简要示例。所有百分比计算都是在服务器端完成的。

function getProgress() {
    $.ajax({
        url: '/progress',           // send HTTP-GET to /progress page
        dataType: 'json',           // return format will be JSON
        success: function(result) { // function to run once the result is pulled
            $("#p1").html('Percentage: %' + result);
            if (result == "100")
                clearInterval(window.progressID);
        }
    });
}

function startGetProgress() {
    window.progressID = setInterval(getProgress, 10000); // update progress every 10 seconds
}

上面的例子使用了 JQuery ajax 方法,http://api.jquery.com/jQuery.ajax/所以你需要引用 JQuery 库。

无论您使用的是 webforms 还是 mvc,您都可以添加一个 web api 控制器来处理 ajax 请求。如果您需要我澄清任何事情,请告诉我。

于 2012-11-01T03:12:49.023 回答