调用其他线程调用的函数时,线程未启动

2023-12-31

我正在使用线程来显示进度窗口,同时执行耗时的操作(for 循环)。在该操作之后,我想停止线程。但是该方法“显示进度对话框“没有被调用。我在其他事件中使用相同的方法,效果很好。下面是代码。

Private Sub TSBRSToLoc_Click(sender As System.Object, e As System.EventArgs) Handles TSBRSToLoc.Click
    Try

        If Not BWRRStoLoc.IsBusy Then
            Dim backgroundThred As New Thread(AddressOf ShowProgressDialog)
            backgroundThred.IsBackground = True
            'Dim formProgree As New ProgressForm
            backgroundThred.Start()
            DisableBtns(sender)
            ProgressBarCompare.Value = 0
            lblProgStatus.Text = ""

            Dim filesSize As Long = 0
            For index As Integer = 0 To ObjlsViewCompare.Items.Count - 1
                Dim file As File = ObjlsViewCompare.GetModelObject(index)
                If Not file.Status = MatchStatus.MisingOnRackSpace Then
                    filesSize = filesSize + file.SizeOnRackSpace
                End If
            Next
            ProgressBarCompare.Maximum = filesSize
            ' formProgree.Close()
            backgroundThred.Abort()
            backgroundThred.Join()
            BWRRStoLoc.RunWorkerAsync()
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

您的代码存在几个问题:

1:你几乎不想打电话Thread.Abort- 这样做可能会产生不可预测的影响,特别是当一个线程终止另一个线程时。请参阅 MSDN 了解更多信息。 http://msdn.microsoft.com/en-us/library/5b50fdsz%28v=vs.100%29.aspx

关闭线程的正确方法是使用某种消息告诉线程自行退出 - 设置静态变量(线程定期检查)、使用同步对象等。Thread.Abort()是一个很大的禁忌。

2:你的逻辑倒退了:你在主线程上进行了耗时的操作(按钮单击事件处理程序显示这是你的主 UI 线程),并且你试图从后台线程显示进度对话框。

应该是相反的:您应该在单击处理程序内设置用于后台处理的所有数据,显示进度对话框(假设它是无模式的),然后启动将执行处理的后台线程。

在处理过程中,后台线程应该不断向进度窗口通知其进度,一旦完成,它还应该向进度窗口通知这一事实。

每当您需要通知 UI 线程时,您都必须正确地将调用编组到正确的线程。这是因为任何 UI 元素只能从创建它的线程访问 - 例如,如果不封送调用,则无法从工作线程设置标签控件的文本。

你需要使用InvokeRequired http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx / BeginInvoke() http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx用于编组。打电话时BeginInvoke()你将通过一名代表;像这样的东西(抱歉 C# 语法,我不太熟悉 VB.NET - 应该很容易移植它):

private void SomeEventHandler ( object oSender, EventArgs oE )
{
    if ( InvokeRequired )
    {
        MethodInvoker oDelegate = (MethodInvoker) delegate
        {
            SomeEventHandler ( oSender, oE );
        };

        BeginInvoke ( oDelegate );
        return;
    }
    else
    {
        // already on the correct thread; access UI controls here
    }
}

所有这一切都是因为控件通过消息处理许多属性更新,并且这些消息必须以正确的顺序同步传递。确保这一点的唯一方法(无需一些非常复杂的编码)是在线程运行消息泵的同一线程上创建所有控件。

See 这个问题 https://stackoverflow.com/questions/2073076/c-sharp-winforms-possible-to-construct-form-on-background-thread-then-display有关在主 UI 线程以外的线程上创建 UI 的更多信息。 (这是可能的,但你只想这样做,如果你真的真的需要那个。这种情况相当罕见。)

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

调用其他线程调用的函数时,线程未启动 的相关文章

  • 设置 Cursor.Position“half”-有效(从一台显示器到另一台)

    我有两个显示器 其中一个是非主显示器 number 1 设置为主要的 number 2 左上角像这样 我再说一遍 number 2是主监视器 这是代码 Cursor Position new Point 500 500 发生的情况是 当光标
  • Java 内存错误:无法创建新的本机线程

    运行 java 服务器时 我在 UNIX 服务器上收到此错误 Exception in thread Thread 0 java lang OutOfMemoryError unable to create new native threa
  • 使用名称变量访问多个表单控件

    我正在尝试迭代一组 ComboBox 并使用连接的字符串和变量来设置属性来表示控件的名称 但是 我无法让表单实例将 String Integer Variable 识别为其控件之一 因此它无法将任何适当的属性或子例程识别为 System W
  • 托管 ODP.NET 驱动程序未显示在“数据源”对话框中

    在我的计算机上安装托管 ODP NET 后 ODP NET 托管驱动程序没有出现在里面选择数据源Visual Studio 2013 Professional 中的对话框 它应该是这样的 这就是它在我的机器上的实际外观 我已按照 轻松驱动
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的
  • 批准后使用 jenkinsfile 构建促销

    仅当更改管理使用 servicenow 更改票证或通过手动批准批准它时 我才需要使用 jenkins 文件将我的构建升级到生产 我想要类似的东西 产品构建只有在经理批准后才能手动触发 他 她应该收到带有批准 拒绝链接的批准邮件 或者 如果与
  • VB.NET 空合并运算符? [复制]

    这个问题在这里已经有答案了 可能的重复 VB NET 中的合并运算符和条件运算符 https stackoverflow com questions 629036 coalesce operator and conditional oper
  • 返回无效或过期令牌的错误

    我正在尝试使用 Owin 实施 OAuth 承载身份验证 当传递无效或过期的令牌时 默认实现是将其记录为警告并且只是不设置身份 然而 在这种情况下 我想拒绝整个请求并出现错误 但我该怎么做呢 深入研究代码后我发现OAuthBearerAut
  • Thread.isInterrupted 不起作用,Thread.interrupted 起作用

    以下程序演示了该问题 最新的 JVM 等 public static void main String args throws InterruptedException if this is true both interrupted an
  • 我应该注意到在 .Net 4.0 中使用任务与线程的区别吗?

    我更新了我的代码以使用任务而不是线程 查看内存使用情况和 CPU 我没有注意到多核 PC 上有任何改进 这是预期的吗 我的应用程序本质上在运行时启动不同对象中的线程 任务 我所做的一切只是简单 Task a new Task a Start
  • 将列表拆分为多个部分 - VB 转换失败

    尝试编写一种将列表拆分为子列表的方法 Private Function SplitIdsIntoChunks ByVal keys As List Of String As List Of List Of String Return key
  • 从字符串数组中删除项目

    我有一个包含如下数据的数据库字段 76 60 12 例如 如果我想删除60 我该怎么办 要删除的号码可以是任何地方 如果需要的话 我还需要删除逗号 我正在使用 NET 2 0 我会用逗号分割字符串 删除元素 然后再次连接字符串 希望这一切都
  • 拆分容器,制作固定面板

    我有一个水平方向的 splitcontainer 我希望仅在表单调整大小期间为 panel2 设置固定高度 并让 splitter 调整 panel2 大小 现在我正在这样做 但我不满意 因为用户注意到面板调整了大小 Private Sub
  • 如何在 VB.Net winforms 应用程序中找到 main() 入口点?

    当我用 C 创建 WinForms 应用程序时 输出类型为Windows Application我得到一个program cs with a static void Main 我可以用它来处理命令行参数等 但是 当我为 VB 创建等效项目时
  • vb.net 中的简单 rot13 编码器

    我正在寻找一种简单的方法将输入的文本编码为 Rot13 在能够将单词分离为单个字符和整数以便我可以更改每个字符并输出结果的阶段 我遇到了困难 我可以使用下面列出的简单 if 语句来使用单个字母来完成此操作 但如果有人可以帮助找到整个单词的方
  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • .NET ListView列顺序问题

    我在表单中遇到问题 我已按以下顺序将列添加到 NET ListView 控件 A B C D A D 列的显示索引按顺序为 0 3 但它们的显示顺序错误 A B D C these are switched at runtime 注意 一切
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • 锁定文件的一个块

    我有一个大小为 192k 的文件 我想锁定文件的中间部分 例如 我想用 c 锁定文件的 64k 128k 知道如何锁定文件的那部分吗 你需要使用锁定文件Ex http msdn microsoft com en us library win
  • NuGet 解决包依赖项的错误版本

    所以我有一个包 NServiceBus Host 依赖于 NServiceBus gt 4 5 0 在 nuget 上有一个 4 5 1 版本的 NServiceBus 当我安装包 NServiceBus Host 时 我得到 PM gt

随机推荐

  • ios Swift 商品未添加到购物车

    当我点击下面的 添加 按钮时 产品不会添加到购物车 并且结帐 0 不会增加到结帐 1 等 我做错了什么 阅读 Larme 的第一条评论后 原始问题得到解决 这是一个菜鸟错误 我忘记将 cell delegate self 放入 tableV
  • 什么是数据库文件系统?

    我对什么是数据库文件系统知之甚少 有人可以向我解释一下数据库文件系统到底是什么 以及它的应用程序是什么吗 它与传统的文件系统有何不同 我怎样才能建造它 典型的文件系统 nix ms dos 等 按层次结构组织文件 例如 c 代表层次结构的顶
  • 如何防止 .htaccess 在特定目录中使用?

    我有一个网站 可以说 http www example com 我正在使用重写模块 但我有一个子文件夹forum example com 我不想要 htaccess要影响这个目录 我该怎么做 If your forum domain com
  • 将参数发送到 Web 服务

    开始之前 我正在使用 Objective C 为 Iphone 编程 我已经使用 NSURLRequest 和 NSURLConnection 实现了对 Web 服务函数的调用 然后该函数返回一个包含我需要的信息的 XML 代码如下 NSU
  • Rails 3,将局部变量传递给部分[重复]

    这个问题在这里已经有答案了 可能的重复 Rails 对将局部变量传递给局部变量的语法感到困惑 https stackoverflow com questions 4402556 rails confused about syntax for
  • 从图像中获取像素颜色[重复]

    这个问题在这里已经有答案了 我在浏览器上有一张图片 我想获取图像颜色的左上角像素 坐标 0 0 无论图像是否旋转 我该如何使用 javascript 或 php 代码来做到这一点 创建画布文档 createElement 获取二维上下文ca
  • 在 tmux 下使用 $TERM='screen-256color' 时,HOME 和 END 键不起作用。为什么?

    我已经设置了 tmux TERM被设置为screen 256color正确 这工作正常 并且颜色设置正确 但是它阻止我发送HOME and END终端的密钥 而是打印为F n and H n 我应该补充一点 home 似乎可以在 irssi
  • 支持 IE11 的 vue cli3 lib

    根据文档 https cli vuejs org guide build targets html library https cli vuejs org guide build targets html library 我不清楚如何集成
  • 在 Node WebKit 中启用触摸事件

    我使用自定义触摸屏 我想默认激活触摸事件节点 webkit https github com rogerwang node webkit 那可能吗 This one https github com rogerwang node webki
  • 如何在不看到控制台的情况下检测unity c#运行时是否有错误? [复制]

    这个问题在这里已经有答案了 是否可以在不读取控制台日志的情况下检测在 Unity 中运行的 C 脚本中的错误 当我必须构建游戏并在手机中测试它时 我需要这个 如果运行时出现错误 它将显示一个消息框来显示错误 据我了解 我们可以使用Unity
  • 如何在 .NET Core 的主布局视图中渲染特定控制器的操作?

    我正在打电话 TopNav 部分来自内部Layout主视图 I want TopNav要强类型化的视图和要在其中创建的模型TopNavController 有什么方法可以从主视图中渲染特定控制器的操作吗 所以在这种情况下我需要渲染TopNa
  • 覆盖后退按钮以充当主页按钮

    按下后退按钮后 我希望我的应用程序进入停止状态 而不是销毁状态 在安卓中docs http developer android com intl fr guide practices ui guidelines activity task
  • @WithUserDetails 似乎不起作用

    我有一个应用程序 其中使用 Spring Social Security 进行身份验证和授权 不幸的是 我在模拟 Spring Security 时遇到了一些问题 似乎根本不起作用 我有一个 REST 控制器 如果它应该返回的实体的标识符不
  • 如何使用MessageUI框架在iPhone上发送iMessage消息

    是否可以使用 iPhone 上的 MessageUI 框架从应用程序内部发送消息 或者 有 iMessage 的 URL 方案吗 使用 iOS 4 您可以从应用程序内部发送电子邮件和短信 使用 MessagUI 视图控制器 由于 iOS 5
  • 用于 Java 的 ANTLR4。如何显示词法分析中的错误

    如何在词法分析过程中显示错误列表 如果有 我尝试了以下方法 但我的输出是 org antlr v4 runtime ConsoleErrorListener 1026c84c 我写的代码 private static String erro
  • 开源 php docx 到 pdf 转换?

    是否有任何开源 PHP 工具可以用来将 doc docx 转换为 pdf 如果您有任何好的教程或工具 将不胜感激 我正在研究 phpLiveDocx 但看起来他们按月收费 或者也许是 php 或 linux 中的 odt 到 pdf 尝试
  • Oracle 10g 上的独占表(读)锁?

    有没有办法在 Oracle 10g 中独占锁定表以进行读取 我对Oracle不是很熟悉 所以我问了DBA 他说在Oracle中不可能锁定一个表来读取 我实际上正在寻找类似 SQL Server TABLOCKX HOLDLOCK 提示的内容
  • 单击标签不会单击 React 中的复选框?

    我创建了一个表单 用户可以在提交表单之前选择选项 我隐藏复选框display none我正在设计
  • Pandas:填充缺失日期的数据

    假设我有下表 ProdID Date Val1 Val2 Val3 Prod1 4 1 2019 1 3 4 Prod1 4 3 2019 2 3 54 Prod1 4 4 2019 3 4 54 Prod2 4 1 2019 1 3 3
  • 调用其他线程调用的函数时,线程未启动

    我正在使用线程来显示进度窗口 同时执行耗时的操作 for 循环 在该操作之后 我想停止线程 但是该方法 显示进度对话框 没有被调用 我在其他事件中使用相同的方法 效果很好 下面是代码 Private Sub TSBRSToLoc Click