Marquee ProgressBar 对 BackgroundWorker 无响应

2024-04-12

在我的代码中,当单击按钮时,进度条设置为选取框,然后调用我的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 中的可视控件不是线程安全的,因此应该never直接做任何需要花费几分钟才能完成的事情。你跳过的圈圈.BeginInvoke() in the RefreshReport()方法具有调用长时间运行的函数的效果在主 UI 线程中.

要解决此问题,您需要关闭跨线程检查,以便不引发异常(简单,但不推荐),或者更改使用控件的方式,以便主要工作发生在其他地方,并且控件仅在以下情况下引发事件:事情已经准备好了。如果您无法将控件修改到那种程度,则说明控件存在设计缺陷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Marquee ProgressBar 对 BackgroundWorker 无响应 的相关文章

随机推荐

  • 为什么我的应用没有在 Google Play 上显示?刚刚发布

    我只是第一次尝试发布我的应用程序 我完成了开发者控制台上的步骤 它现在显示 已发布 并带有绿色复选标记 在我点击 激活 和 发布 后 没有错误 然而 我尝试在手机 平板电脑和 Chrome 浏览器上的 Google Play 商店 称为 U
  • 将 PHP 多维数组返回到 Javascript/AJAX

    我的理解是 为了将复杂的 PHP 变量返回给 Javascript 应该通过 AJAX 和 json encode 来完成 有人能给我一个实际的例子 PHP 和 Javascript 代码 吗 假设我们在 PHP 中有一个两维数组 twoD
  • Firebase 字段名称会自动更改吗?

    你好 firebase 开始自动更改我的字段名称 这造成了一个大问题 我怎么解决这个问题 My Class public class TUser private String UserKey private String LicenceKe
  • C# 4 中会有通用属性吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 备份文件关闭Excel VBA

    我希望 Excel 在文件关闭时自动备份工作簿 而不提示用户 我在网上找到了下面的优秀代码 忘记源代码 但备份文件类型正在更改为我无法打开的 BAK 文件 我该如何解决这个问题 两个文件将位于同一文件夹中 备份应具有相同的文件名和 bak
  • 函数模板特化编译错误

    A hh template
  • 检索 ODBC 表并插入 SQL Server CE 数据库

    我有一个到数据库的 ODBC 连接 我需要其中的一个数据表 该表大约有 20 行和几千行数据 我打算将此表插入到我的本地 SQL Server CE 数据库中 以便进一步使用它 两种连接都经过测试并且可以工作 我的尝试是只插入一列以使事情变
  • 创建与 .accdb 访问文件的连接

    我已经上这门课几天了 现在正在网上搜索试图找到解决方案 我在这里尝试做的是使用扩展名连接到 Access 2010 数据库 accdb我已经成功连接到旧数据库的扩展 mdb但不是 accdb 我尝试卸载 Office 并重新安装 x64 版
  • Zend 反向匹配路由返回当前 URL

    我正在使用 Zend Framework 并尝试设置一些自定义路由 这些在调度期间似乎工作正常 但反向匹配根本不起作用 这些是我设置的路线 router gt addRoute category new Zend Controller Ro
  • 用于获取 netstat -s 统计信息的 Windows API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个 Windows API 它返回与 netstat s 相同的统计信息 您可以使用Get
  • 如何将以 HTML 编写的 SVG 保存为 SVG 文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 以下 SVG 代码写入 HTML 文
  • 只读可见目录的文件名

    我试图读取文件夹的文件名并将它们保存在数组列表中 但我在数组中得到了我不想要的不可见文件名 实际上我只想保存 txt 文件名 有谁知道在创建列表之前如何在代码中更改它 String pathLevel Users MaxRuizTagle
  • 如何在 Oracle PLSQL 中将数字的小数位数扩展到最少?

    我不知道如何选择以下内容 123 gt 123 00000 123 12 gt 123 12000 123 123456 gt 123 123456 我想将小数位数扩展到例如 5 位小数 最少 如果根本没有小数位 则应该有 5 个零 小数点
  • 此更新、选择组合查询线程安全吗?

    我有一张名为席位的桌子 其架构如下 id taken 对于每个用户 我随机选取一个未采取的 id 并分配给该用户 这里为简单起见 我将采取 1 我正在使用的查询 update seats u inner join SELECT id fro
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • http header 和 html meta 中的字符集有什么区别?

    您可以在 http 响应标头中发送字符集 也可以在发送的 html 文件中定义字符集 如果这两个字符集不同会发生什么 浏览器如何使用在 http 标头中收到的字符集以及它在 html 文件本身中提供的字符集有何关系 HTML 4 01 规范
  • 有没有办法以编程方式清除 EXCEL VBA 事件队列?

    有没有办法以编程方式清除 EXCEL VBA 事件队列 在 EXCEL VBA 中 当更改工作表单元格然后用户按 ENTER 提交单元格编辑时 工作表级别会发生两个事件 他们是 私有子工作表 更改 ByVal 目标作为范围 私有子工作表 S
  • 日网格中全日历 2.1.0-beta1/2 中的多行标题

    我刚刚将项目中的 fullcalendar 从 1 5 2 升级到 2 1 0 beta2 从那时起 由于此处引入了新的 CSS 样式 我的活动标题被切入第一行 溢出隐藏 https github com arshaw fullcalend
  • 登录后重定向和会话数据传输到另一个服务器/域

    经过一段时间的搜索和阅读文档后 我决定问你们 所以 场景很 简单 用户前往https Domain1 com https Domain1 com 输入他的凭据 尝试登录 登录成功后 根据用户类型和数据库中的其他信息 Domain1 服务器应
  • Marquee ProgressBar 对 BackgroundWorker 无响应

    在我的代码中 当单击按钮时 进度条设置为选取框 然后调用我的BackgroundWorker 但是当调用BackgroundWorker 时 进度条会冻结或消失 我使用BackgroundWorker 将ReportViewer 的Refr