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

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(使用前将#替换为@)

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

随机推荐

  • 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