我需要执行一个后台任务,其中包含一个显示完成百分比的进度条和一个取消按钮。除了任务细节之外,目前我只想得到一个实例,所以我只有三个主要的事件处理程序(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”。
提前致谢!
答案 0 :(得分: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请求。如果您需要我澄清任何事情,请告诉我。