如何在WinForm组件的UI线程上调用?

2023-12-01

我正在编写一个 WinForm 组件,在其中启动一个任务来进行实际处理并捕获延续中的异常。从那里我想在 UI 元素上显示异常消息。

Task myTask = Task.Factory.StartNew (() => SomeMethod(someArgs));
myTask.ContinueWith (antecedant => uiTextBox.Text = antecedant.Exception.Message,
                     TaskContinuationOptions.OnlyOnFaulted);

现在,我收到跨线程异常,因为该任务正在尝试从显然非 UI 线程更新 UI 元素。

但是,Component 类中没有定义 Invoke 或 BeginInvoke。

如何从这里继续?


UPDATE

另外,请注意,Invoke/BeginInvoke/InvokeRequired 在我的 Component 派生类中不可用,因为 Component 不提供它们。


您只需向组件添加一个属性,允许客户端设置一个表单引用,您可以使用该引用来调用其 BeginInvoke() 方法。

这也可以自动完成,最好这样没人会忘记。它需要一些相当难以理解的设计时魔法。这不是我自己想出来的,我是从 ErrorProvider 组件中得到的。值得信赖的来源等等。将其粘贴到您的组件源代码中:

using System.Windows.Forms;
using System.ComponentModel.Design;
...
    [Browsable(false)]
    public Form ParentForm { get; set; }

    public override ISite Site {
        set {
            // Runs at design time, ensures designer initializes ParentForm
            base.Site = value;
            if (value != null) {
                IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
                if (service != null) this.ParentForm = service.RootComponent as Form;
            }
        }
    }

当用户将组件放在窗体上时,设计器会自动设置 ParentForm 属性。使用 ParentForm.BeginInvoke()。

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

如何在WinForm组件的UI线程上调用? 的相关文章

  • 从 C# 应用程序调用 ASP.net Web 服务

    我有个问题 我如何调用 Web 服务并从 C 桌面应用程序获取结果 我正在制作一个桌面应用程序 我希望它能够连接到我的在线 ASP net Web 服务 这怎么可能 在 解决方案资源管理器 中 右键单击项目节点并选择 添加 Service参
  • 基本 WinForm KeyDown 事件处理

    我正在使用 WinForms 我已经为KeyDown主窗体的事件 从而调用按钮的Click事件处理程序 The Click调用的事件处理程序取决于按下的特定键 如果用户单击该按钮而不是使用该键 然后随后尝试使用该键 则该键 例如向下箭头 将
  • 单击用户控件时如何防止窃取焦点? [复制]

    这个问题在这里已经有答案了 我希望能够单击我的用户控件 而不让它从任何其他控件中窃取焦点 我知道当你点击标签时它不会夺走焦点 如何才能做到这一点 尝试禁用您的控件ControlStyles Selectable http msdn micr
  • 如何使树视图不可折叠?

    使用WinForms中的TreeView控件 是否有一个属性可以设置为隐藏每个节点的折叠节点图标 另外 如何永久展开 TreeView 中的所有节点 你需要处理OnBeforeExpand事件和设置Cancel to true privat
  • 具有不透明度的 WinForm 控件

    我有一个本身有一些控件的表单 btnCreateReport pnlDarkLayer 我有一个适合表单的面板 Dock Fill 它位于所有控件的背面 当用户单击 btnCreateReport 按钮时 我调用 pnlDarkLayer
  • 模态对话框是如何实现的?

    很长一段时间我一直想知道模态对话框是如何实现的 让我以Qt为例 几乎所有的GUI工具包都有这个机制 在主事件循环中 调用一个槽 并在该槽中打开一个模式对话框 在对话框关闭之前 槽不会将控制返回到主事件循环 所以我认为主事件循环被阻塞并且变得
  • 如何自动将VS2003类转换为部分Designer.cs文件?

    我正在将项目从 Visual Studio 2003 升级到 2008 并希望自动生成XXX Designer cs文件并更新相应的XXX cs原版的 有什么自动的方法吗 UPDATE 我指的是WinForms 当然 我知道旧样式有效 但我
  • 滚动时在面板中平滑地绘制或绘制子控件

    在使用 Tab 控件的 TabPage 中的 Panel 控件时 我有很多子控件 如 RichTextBox 按钮 标签等 问题是当我在面板中滚动时 内部会闪烁 子控件没有像它们已经存在一样顺利地显示 淹没 绘制 寻找可以使滚动平滑并消除闪
  • 在 React 中切换 css 类

    如何使用布尔值切换 React 中元素上 css 类的存在 在 Angular 2 中我可以这样做 class red isRed 如何在 React 中做熟悉的事情 在 React 中 元素使用如下语法获取它们的类 div div 但请注
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 有没有办法将应用程序覆盖在全屏程序上?

    我希望开发一个应用程序 它本质上是一个计时器窗口 它始终显示在任何其他应用程序前面的屏幕上 并且在聚焦其他窗口时永远不会落入背景 一个例子是 当我玩全屏游戏时 我希望这个计时器覆盖游戏 并且当我单击窗口上的计时器按钮时 它不会关闭游戏 我有
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • PreviewKeyDown 不会在 ElementHost 中针对 Tab 和箭头键触发

    我在 Winforms ElementHost 中有一个 WPF 窗口 我的窗口上的 Tab 键和箭头键不会触发 KeyDown 和 PreviewKeyDown 事件 KeyUp 和 PreviewKeyUp 似乎工作正常 Preview
  • 设置滚动条粗细

    有没有办法调整滚动条的粗细JScrollPane 默认值有点笨拙 一个快速但又肮脏的解决方案是将宽度 高度明确设置为例如10 像素通过 jScrollPane getVerticalScrollBar setPreferredSize ne
  • 如何使用单独的线程部分重绘自定义 SurfaceView 而不会丢失以前的编辑?

    我目前在按照自定义绘图时遇到问题SurfaceView来自不在我的主 UI 上的线程 这SurfaceView占据整个屏幕 Galaxy S3 全屏 并且必须从多个来源进行更新 问题是习惯SurfaceView不会保存 UI 更新之间的更改
  • 在 Primefaces 中以编程方式创建命令按钮

    我正在尝试创建一个带有输入文本和命令按钮的动态表单 一切正常 但是当我单击命令按钮时 永远不会调用操作侦听器 请提出我做错了什么或者这是否是 PF 或 Mojarra 的错误 代码如下 panel new Panel panel setHe
  • 在运行时从 DataGridView 动态创建 RDLC 报告

    我有一个表格AdvancedSearchForm with a 数据网格视图控制dgrData和一个按钮Report在 C Winform 中 单击按钮时Report 我希望有一个表格报表视图控件显示与 DataGridView 中相同的列
  • GUI 测试工具 PyUseCase 与 Dogtail 相比如何?

    GUI测试工具如何Py用例 http pypi python org pypi PyUseCase重命名为故事文本 http pypi python org pypi StoryText 相比于Dogtail http en wikiped

随机推荐

  • 如何在控制台应用程序中添加 C# 登录尝试循环?

    我是这门语言的新手 我尝试了一些方法 但无法弄清楚如何设置登录循环以使用最大登录尝试次数 3次 有人可以帮我吗 static void Main string args Console WriteLine Status status Ona
  • 如何在按下按钮后在 JQuery / ASP.NET 中创建淡入淡出标签

    我认为这应该很容易 但我不太确定如何连接 我有一个页面 用户可以在其中定义查询 完成后 用户输入查询的名称并按下按钮 我想处理按钮单击 使文本标签 或跨度 可见几秒钟 然后让它淡出 由于它是回发 我可以将 ASP Label 控件变为可见
  • 仅从特定活动中读取 NFC 标签

    我先告诉你我在做什么 我按顺序进行了三项活动 活动1 gt gt 活动2 gt gt 活动3 现在 当我点击标签时 我只想从 Activity2 读取 NFC 标签 当我处于 Activity1 或 Activity3 中时 我的应用程序应
  • 如何将父组件注入子组件?

    我正在尝试将父组件注入子组件中 我认为这很简单 只需在子组件中指定 注入父组件constructor constructor private parent AppComponent child component constructor 我
  • 限制文本框中的数字和字母 - C#

    我想限制可以在文本框中输入的数字和字母 假设我只想允许数字 0 5 和字母 a d 小写和大写 我已经尝试使用屏蔽文本框 但它只允许我指定数字 字母 均无限制 或数字和字母一起但按特定顺序 最好的情况是 用户尝试输入数字 6 但文本框中没有
  • 使用 Trace 函数以 Haskell 的 do 表示法进行惰性求值

    我想知道为什么这个 调试消息 1 没有打印在这个片段中 import Debug Trace main do return trace debug message 1 trace debug message 2 return 第二个 调试消
  • 与新的导航堆栈结合时发现 @State 的奇怪行为 - 这是一个错误还是我做错了?

    我已将我的 swiftui 应用程序转换为新的导航栈以编程方式管理使用导航堆栈 路径 visibilityStack 这样做时 我发现 State 的意外行为让我认为视图没有正确关闭 事实上 当我用堆栈中的另一个视图替换该视图时 State
  • 如何通过选择随机变量在 Python 中执行随机事件?

    假设我必须变量 狗和猫 Dog 5 cat 3 我如何告诉 Python 随机选择这些变量之一并将其打印到屏幕上 import random print random choice dog cat 就是这么简单 choice 获取一个序列并
  • Pygame:尝试理解 Sprite 类

    我发现在Pygame 文档一个名为Sprite 我读了解释 但不明白这个类是用来做什么的 我知道我们用它来通过构造函数继承其他类 但仅此而已 如果有人有明确的解释用处班级的 以及如何用好 我有兴趣 是的 所以移动鼠标光标 那是一个精灵 它是
  • 内部服务器错误[重复]

    这个问题在这里已经有答案了 我正在开发一个短信发送应用程序 出于登录目的 我想使用 POST 方法将用户名和密码从我的 Android 应用程序发送到 Web 服务器 当我单击登录按钮时 应用程序没有响应 并且控制台打印以下消息来响应 Po
  • ReactJS:使用alert()获取用户输入

    我该如何使用alert 允许用户输入他们的名字并将其保存到状态 这是我到目前为止所做的尝试 render function return div div
  • 如何在 C# 中检查 Excel 文件的版本?

    我需要区分所选文件是使用所选 Excel 文件的 Excel 2010 或 Excel 2013 版本创建的 并且服务器上的 Excel 应用程序必须匹配才能继续 我可以获得服务器的Excel应用程序版本 xApp new Microsof
  • 如何将 Base64 格式的文件附加到 Laravel 5.2 邮件

    我有 Angular 应用程序作为前端 Laravel 5 2 作为 api 后端 我的角度应用程序将参数发送到我的 laravel 控制器 name My Name email email protected subject Hello
  • Django模型时间范围过滤方法

    我在一个老问题中看到了接下来的两种方法here但我不清楚以下之间有什么区别 date time field range datetime datetime combine date datetime time min datetime da
  • 在 Papertrail 中显示单个记录的所有版本

    我正在构建一个联赛系统 目前它根据结果存储和更新玩家的 elo 得分 现在 我尝试添加 HighCharts 以漂亮的折线图显示球员在整个赛季的 elo 得分 有人建议我使用 Papertrail 来存储更新 我已经全部安装了 现在我的问题
  • Jenkins 和 Windows 批处理返回代码

    我使用 Jenkins 在 Windows 机器上 作业通过 Ant 为不同目标编译一些代码 为此 我将对 ant 目标的调用包装在 Windows 批处理循环中 如下所示 echo off for t in target1 target2
  • 基于第一个下拉菜单的第二个下拉选项

    在网页上 如果您在第一个下拉列表中选择不同的选项 则第二个下拉列表中将出现不同的选项
  • 我已启用 V8 运行时,但尝试保存时出现错误:“很抱歉,发生服务器错误。请稍等一下,然后重试。”

    我得到了 很抱歉 服务器发生错误 请稍等一下 然后重试 当尝试保存脚本时 如果我按原样运行脚本 它将运行旧版本 这是我的代码 function myFunction var ss2 SpreadsheetApp getActiveSprea
  • '字符不可用'请直接使用字符串

    我不知道如何解决它 我只是想了解它是如何工作的以及应该替换什么 我已经尝试过删除characters 但还是不行 import Foundation var shrinking String hello repeat print shrin
  • 如何在WinForm组件的UI线程上调用?

    我正在编写一个 WinForm 组件 在其中启动一个任务来进行实际处理并捕获延续中的异常 从那里我想在 UI 元素上显示异常消息 Task myTask Task Factory StartNew gt SomeMethod someArg