gpt4 book ai didi

vb.net - 选取框 ProgressBar 对 BackgroundWorker 无响应

转载 作者:行者123 更新时间:2023-12-01 04:22:41 24 4
gpt4 key购买 nike

在我的代码中,当单击按钮时,进度条设置为选取框,然后调用我的 BackgroundWorker,但是当调用 BackgroundWorker 时,进度条卡住或消失。我使用 BackgroundWorker 将 ReportViewer 的 RefreshReport 方法与 UI 线程分开。任何帮助表示赞赏。谢谢!

    Private Sub btnOtherReport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOtherReport.Click
rvReport.ProcessingMode = ProcessingMode.Remote
rvReport.ShowParameterPrompts = False
rvReport.ServerReport.ReportServerUrl = New Uri("REPORT_SERVER_URL")
rvReport.ServerReport.ReportPath = "REPORT_PATH"
rvReport.BackColor = Color.White

BackgroundWorker1.RunWorkerAsync()
End Sub


Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
RefreshReport()
End Sub


Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
pbReports.Style = ProgressBarStyle.Blocks
pbReports.Value = 100
End Sub


Public Sub RefreshReport()
rvReport.BeginInvoke(New MethodInvoker(AddressOf rvReport.RefreshReport))
End Sub

最佳答案

问题是当您调用 .BeginInvoke()在您的 RefreshReport()方法。 BackgroundWorker.DoWork()方法已经在不同的线程中提出,所以你可以调用 rvReport.RefreshReport() .它应该如下所示:

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
rvReport.RefreshReport()
End Sub

真的就是这么简单,还可以使用 Monitor锁定您的报告对象并防止重新输入。

现在,当您调用 .BeginInvoke()报告过程开始了,但它根本没有阻塞,所以 DoWork() 没有任何剩余。方法来做。它只是立即返回。此时 BackgroundWorker 认为它已经完成,因此调用 .RunWorkerCompleted()方法,它会停止你的进度条。

根据评论, rvReport是一个可视化控件而不是一个组件或简单的数据访问类。在这种情况下,您应该知道 .Net 中的可视控件不是线程安全的,因此永远不应该直接执行任何需要花费几分钟才能完成的操作。你用 .BeginInvoke() 跳过的圈子在 RefreshReport()方法具有在主 UI 线程中调用长时间运行的函数的效果。

要解决此问题,您需要关闭跨线程检查以便不抛出异常(简单,但不推荐)或更改您使用控件的方式,以便主要工作发生在其他地方并且控件只是在以下情况下引发事件东西准备好了。如果您无法将控件修改到该程度,则这是控件中的设计缺陷。

关于vb.net - 选取框 ProgressBar 对 BackgroundWorker 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com