如何获取winform的GUI线程?

2023-11-27

我有一个带有多个 GUI 线程的 winforms 应用程序。我希望他们能够访问彼此的线程对象,而不必单独跟踪该信息。

.NET 中是否有一个函数可以提供 winforms 控件或窗口对象,并返回线程?或者我可以为 threadID pinvoke API 中的函数?

(请不要评论说我应该用另一种方式来做......而且这也不是关于跨线程窗口操作。)

Thanks!

Edit

对于那些出于某种原因相信我的斜体文字的人,恭喜,你被录取了!!问题是这样的:

“应用程序因完全锁定而在野外崩溃,也就是说,它停止响应。非常间歇性,并试图调试它,它似乎永远不会发生。”

那么做什么呢?在程序中安装一个选项,用户可以在我们的指导下激活该选项,从而从同一应用程序中的另一个 GUI 线程,在主 GUI 线程上执行 thread.abort,然后我们可以查看错误日志中的调用堆栈。 Viola 在不到一天的时间内发现了一个无法调试的错误。 (现在停下来,这与滥用多线程无关:-)

我承认我几乎没有问这个,我这样做的原因是我可以看到对主窗体的对象引用,但它的线程没有任何对象引用。我正在给 Chris Shain 答案,这是一种快速的方法,不幸的是,当线程挂起时,我将无法执行调用(它也会挂起)。进一步挖掘发现了 GetWindowThreadProcessId API 调用。但它是一个非托管线程 ID,显然将其转换为托管线程 ID 会很复杂。

所以我硬着头皮放入了对主 UI 线程的全局引用。本来想发帖的,只是还没写。

现在如果你能原谅 VB...

在主公共模块/静态类中:

Public GUIThread As Threading.Thread
Sub Main()
    '' //  Create app main window
    ShellForm = New frmShell
    '' // Save main GUI Thread for abort routine
    GUIThread = Threading.Thread.CurrentThread  
    If GetSetting("MyApp", "Testing", "CrashDebug", "False") = "True" Then
            '' //  DO NOT run the pgm. like this normally - with try/catch around
            '' //  Application.Run - or uncaught errors will kill the whole app!!!
        Try

            '' // This is the other of the ‘Multiple GUI threads’ I talked
            '' // about in the Orig Post.
            Dim t As New Threading.Thread(AddressOf StartCrashDebug)
            t.Start()

            Application.Run(ShellForm)
        Catch ex As Exception
            '' // This error routine passes errors off to another thread which 
            '' // logs them (and also shows messages)
            MyLogError(ex, "CrashDebug - Main Window blew up")
        End Try
    Else
        '' // Normal mode - uncaught errors will get caught by UnhandledException, 
        '' // logged, and Winforms will keep the GUI alive (since we _do_ care 
        '' // more about users than computers right ;-)
        Application.Run(ShellForm)
    End If
End Sub
Sub StartCrashDebug()
    Dim f As New frmCrashFinder
    '' // Starting a window like this on a separate thread makes it ‘Another 
    '' // GUI thread’ for winforms, by design
    Application.Run(f)
 End Sub

在“中止”WinForm 中:

Public Class frmCrashFinder 
    Inherits Windows.Form

    Private Sub Abort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Abort.Click
        GUIThread.Abort()
    End Sub
End Class

Windows 窗体中的所有 GUI 元素通常都在单个线程上完成。我强烈建议避免尝试以任何其他方式执行此操作。

您始终可以通过对任何 Control 使用 Control.Invoke 或 Control.BeginInvoke 将代码编组到该线程。

如果你真的想获取线程的ID(不确定这有什么用..?),你可以使用:

int GetControlThreadId(Control control)
{
    int threadId;
    control.Invoke( new Action( () => 
       {
           threadId = Thread.CurrentThread.ManagedThreadId;
       }));
    return threadId;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取winform的GUI线程? 的相关文章

  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 无法通过 HTTPS 调用 Web 服务

    我正在开发一个 Net 应用程序 它与 Web 服务通信以获取一些数据 Net 应用程序和 Web 服务之间的连接是通过 HTTPS 完成的 当我从 Net 应用程序调用 Web 服务时 我得到以下堆栈跟踪 System Net WebEx
  • 序列化和反序列化 Visual Studio 解决方案文件 - 或以编程方式编辑?

    我想以编程方式添加和删除项目 解决方案文件夹和其他项目 例如解决方案的资源文件 但我不确定最好的方法是什么 对于那些不知道的人 高度简化 解决方案文件 sln 通常如下所示 Microsoft Visual Studio Solution
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 使用 AdHocWorkspace 会导致“不支持语言‘C#’”。

    在VS2015中使用Microsoft CodeAnalysis CSharp Workspaces的RC2 这段代码会抛出异常 var tree CSharpSyntaxTree ParseText var workspace new A
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • “int i=1,2,3”和“int i=(1,2,3)”之间的区别 - 使用逗号运算符的变量声明[重复]

    这个问题在这里已经有答案了 int i 1 2 3 int i 1 2 3 int i i 1 2 3 这些说法有什么区别 我无法找出任何具体原因 Statement 1 Result Compile error 运算符的优先级高于 运算符
  • 为什么使用 HTTP 动词?

    因为动词的目标是像 server domain getallrecords 或 server domain delete1record 或类似的 URL 而getallrecords delete1record都是专门为特定目的而设计的 为
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • 使用 System.Security.Cryptography 将 Win32 Crypto API 调用转换为 C#

    我接到一项任务 要删除我们产品的一个 dll 并将其替换为纯 C 的 dll 旧的 DLL 是 NET 2 0 托管 C C CLI 它包装了对 Win32 本机加密 API 的调用 新的 DLL 应公开具有相同名称和方法的新对象 但应使用
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个

随机推荐

  • 如何引用 Visual Studio 项目中用户定义段的开头?

    我正在努力转换与 gnu 工具链的 ld 链接的 C 程序 使其编译为 Visual studio 2005 项目 该程序将 data symbol 放在不同的段中并在 初始化阶段它在段之间复制数据 指向的指针 段的开始和结束在 ld 链接
  • 协议术语:消息与数据包

    在实践中 对于采用更高级别协议 例如 TCP IP 之上的协议 通过网络传输的通信最合适的术语是什么 具体来说 我指的是小的二进制数据单元 我在各种客户端 服务器库中都看到过 消息 和 数据包 但我对社区的共识感兴趣 这些绝对是消息 数据包
  • Pyinstaller 和 Pycrypto

    我们最近将 pycrypto 添加到我们一直在开发的项目中 现在我无法在使用 pyinstaller 构建该软件后运行该软件 我在 pyinstaller 中遇到了新软件包的问题 但我无法特别修复这个问题 我在尝试运行构建的软件时遇到的错误
  • 我收到错误:未定义的类“必需”。当尝试使用必需的关键字时

    我收到错误 未定义的类 必需 当尝试使用必需的关键字时 这是代码示例 class Field final int id final String name final bool userEditable final String title
  • 在清单中具有共享用户证书功能的 Windows Phone 8.1 应用程序中出现部署错误

    如果我检查 Windows Phone 8 1 应用程序清单中的 共享使用的证书 功能 我会收到以下错误 错误 DEP0001 意外错误 无法注册包 HRESULT 异常 0x80073CF6 Manifest
  • 如何使用android API从android中获取wifi网络的名称?

    我认为我应该使用 NetworkInterface getDisplayName 我有一些名称 但这个名称与我在选择要连接的网络时看到的名称不同 android net wifi WifiInfo getSSID WifiManager w
  • 为什么 Tuple 或 KeyValueItem 没有 setter?

    我需要一个包含一对值的结构 其中的值将被更改 所以我的第一个想法是使用 KeyValueItem 或 Tuple 但后来我发现它们只有一个吸气剂 我不明白为什么 在我的情况下你会用什么 我可以创建自己的类 但是还有其他方法吗 它们是不可变的
  • iOS - 将图像保存为jpg格式

    我的问题是图像保存的格式是什么 是dat还是jpg 这是我使用的代码 NSString urlImage NSString folderPath NSString imageName urlImage componentsSeparated
  • 烧瓶在容器内工作,但当我将其向前移动时却无法工作

    我正在尝试 我正在尝试使用 docker 运行一个简单的 Flask 应用程序 使用this网站作为参考 我的泊坞窗文件 FROM ubuntu latest RUN apt get update y RUN apt get install
  • 如何在 F# 中获取函数参数的名称?

    我可以编写一个返回作为参数给出的函数名称的函数吗 let funName f string returns the name of f 例如 如果我通过printfn作为 funName 的参数 它返回 printfn gt funName
  • 用于单元测试的 EmberJS 服务注入 (Ember QUnit)

    Specs 灰烬版本 1 13 8 节点 0 10 33 npm 2 13 4 I have import Alias from services alias moduleFor controller test Controller tes
  • PostgreSQL的括号规则,有总结指南吗?

    在数学和许多编程语言中 我认为标准SQL也 括号改变优先级 首先对要评估的部分进行分组 或增强可读性 对于人眼 等效示例 SELECT array 1 2 gt array 1 SELECT array 1 2 gt array 1 SEL
  • jQuery 文本到链接脚本? [复制]

    这个问题在这里已经有答案了 有谁知道有一个脚本可以选择对 URL 的所有文本引用并自动将其替换为指向这些位置的锚标记 For example http www google com would automatically turn into
  • 在 Safari iOS 13 + 上禁用双击缩放

    如何在 Safari iOS 13 移动设备上禁用 双击缩放 有时会缩放 有时则不会 我觉得它可能只适用于特定的 HTML 元素 我读到 双击缩放 应该在 iOS 13 上默认禁用 只有捏合缩放才可以工作 但事实并非如此 您可以添加以下元标
  • ReactJS onClick setState 到不同的元素

    我是新来反应的 我遇到了一个小问题 也许有人可以帮助我 所以问题是我无法使用 onCLick 函数触发我想要的元素 现在我试图删除导航 import React from react import ReactDOM from react d
  • jQuery / ajax 上传图像并保存到文件夹

    更新下面的代码 我发现一些代码能够上传图像并显示其缩略图 但是 我也想将图像保存到特定文件夹中 我可以使用什么 jQuery 代码或 ajax 代码将原始图像保存到我选择的文件夹中 这是现场演示 http jsfiddle net dn9S
  • 展平浅嵌套列表的习惯用法:它是如何工作的?

    我在我正在开发的模块中找到了这段代码 l opaque function thingys x for y in l for x in y 我读不懂这个 通过实验 我能够确定它正在展平 2 级嵌套列表 但语法对我来说仍然不透明 它显然省略了一
  • Django REST Framework ValidationError 始终返回 400

    我正在努力强迫ValidationError返回与 400 不同的状态代码 这就是我所做的 class MyValidationError ValidationError status code HTTP 403 FORBIDDEN 然后在
  • 如何重载间接运算符? (C++)

    我正在尝试创建一个迭代器类作为列表类的成员类 并尝试重载间接运算符 以访问它指向的列表 template
  • 如何获取winform的GUI线程?

    我有一个带有多个 GUI 线程的 winforms 应用程序 我希望他们能够访问彼此的线程对象 而不必单独跟踪该信息 NET 中是否有一个函数可以提供 winforms 控件或窗口对象 并返回线程 或者我可以为 threadID pinvo