在ASP.NET中使用AJAX的后台工作

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

在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”。

提前致谢!


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请求。 让我知道你是否需要我澄清任何事情。

链接地址: http://www.djcxy.com/p/65483.html

上一篇: Using a background worker in ASP.NET with AJAX

下一篇: How does copying/passing instances of a WebDriver work, and is it dangerous?