首页 文章

使用ASP.NET中的后台工作程序和AJAX

提问于
浏览
8

我需要执行一个后台任务,其中包含一个显示完成百分比的进度条和一个取消按钮 . 除了任务细节之外,目前我只想得到一个实例,所以我只有三个主要的事件处理程序(DoWork,ProgressChanged和RunWorkerCompleted)和一个循环,只是增加一个计数器并在DoWork中休眠50ms . 但是,除了最后一次之外它不会更新 .

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

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

2) If yes ,我确实需要AJAX,一个最简单,最简单的方法,一个不了解AJAX的人可以做些什么来让后台工作者在ASP.NET网页上运行?

3) If no ,我不是't need AJAX, can anyone point me to a working sample that doesn'使用它?即使它使用其他线程方法而不是后台工作者,我感兴趣 .

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

代码来自.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” .

提前致谢!

1 回答

  • 5

    Web编程提供了许多挑战,这些挑战在桌面编程时很容易被认为是理所当然的 . 从一个移动到另一个可能需要进行大量更改 . 产生长期运行的线程是需要更多关注以避免陷阱的事情之一 . 应用程序池不知道您生成的线程,因此当它回收时会杀死那些导致应用程序出现意外行为的线程 . 有关详细信息,请参阅此帖子,Can I use threads to carry out long-running jobs on 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请求 . 如果您需要我澄清任何事情,请告诉我 .

相关问题