BackgroundWorker任务阻止了我的Web应用程序中的UI线程

时间:2019-03-12 04:27:20

标签: asp.net vb.net

好的,我一直在解决这个问题近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也不会得到渲染。

有什么线索让我错过了吗?

[顺便说一句,在本网站和其他网站上,沿着这些思路有几个问题,当前答案均不适用。我已经在几个站点上进行了烹饪,并抛出了多个版本,这是我最接近可行的方法了,这与我开始的地方没有什么不同:用户单击“执行”按钮,看不见很多内容发生在服务器删除新文件时,然后页面刷新完成。 ]

0 个答案:

没有答案