好的,我一直在解决这个问题近10个工作小时,没有什么可说的进步。在经历了网络上提供的多个“解决方案”之后,我发现自己仍然无法完成应该是一个非常简单的任务-在完成漫长的过程之后,我迫使Web用户从Web应用程序中弹出模式对话框。等待。
我已经剔除了所有非多线程控制方面的内容,并保留了这种裸露的骨骼结构,但是它仍然没有被切掉:
在我的ASPX文件中,有两个“请稍候”显示,一个是设置为与bPopup一起使用的DIV,另一个是按照BackgroundWorker上的示例的DIV runat = server。当独立于任何后台工作使用时,bPopup对话框非常有用。但是,当后台工作人员触发时,UI冻结,直到完成为止,然后两者都以最快的速度打开和关闭bPopup对话框,基本上使屏幕闪烁。
这是我的代码背后:我已将其削减到最低限度,以查看弹出的对话框并在后台任务完成后再次消失。
Protected Sub EditBtn_Click(sender As Object, e As EventArgs)
ScriptManager.RegisterStartupScript(Page, Page.GetType, Guid.NewGuid().ToString(), "javascript: bPopup = $('#element_to_pop_up').bPopup({ modal: true, modalClose: false});", True)
MenusBeingGenerated.Visible = True
bw = New BackgroundWorker()
bw.WorkerReportsProgress = True
bw.WorkerSupportsCancellation = True
bw.RunWorkerAsync()
End Sub
javascript会触发bPopup,而MenusBeingGenerated是服务器端DIV的名称。后台任务本身已被简化为无所事事的时间消耗。
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
For i = 1 To 40
Threading.Thread.Sleep(250)
bw.ReportProgress(i, "Running...")
If bw.CancellationPending Then
bw.ReportProgress(i, "Cancelling...")
Exit For
End If
Next
' Cleanup
If bw.CancellationPending Then
e.Cancel = True
bw.ReportProgress(100, "Cancelled.")
End If
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bw.ProgressChanged
StatusLabel.Text = e.ProgressPercentage.ToString & "% complete."
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
StatusLabel.Text = "Completed successfully"
ScriptManager.RegisterStartupScript(Page, Page.GetType, Guid.NewGuid().ToString(), "javascript: if (bPopup) { bPopup.close() };", True)
End Sub
当我运行此代码时,单击触发它的按钮都将有很长的暂停,然后屏幕闪烁为灰色(通过在同一按钮处理程序中打开和关闭bPopup可以看到相同的行为)。
添加断点以遍历代码,我看到后台任务是通过按钮处理程序启动的,它循环执行,并且每隔四分之一秒调用一次BackgroundWorker1_ProgressChanged处理程序,最后运行BackgroundWorker1_RunWorkerCompleted方法,并在此时完成唯一的页面刷新最终发生(随着bPopup触发并清除而闪烁)。
即使已设置为可见,DIV id = MenusBeingGenerated也不会显示,位于其中的标签id = StatusLabel也不会得到渲染。
有什么线索让我错过了吗?
[顺便说一句,在本网站和其他网站上,沿着这些思路有几个问题,当前答案均不适用。我已经在几个站点上进行了烹饪,并抛出了多个版本,这是我最接近可行的方法了,这与我开始的地方没有什么不同:用户单击“执行”按钮,看不见很多内容发生在服务器删除新文件时,然后页面刷新完成。 ]