如何在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线程上调用? 的相关文章

  • CakePHP PaginationRecallComponent,严格 (2048):PaginationRecallComponent::initialize() 声明

    我尝试插入分页调用组件 http bakery cakephp org articles Zaphod 2012 03 27 paginationrecall for cakephp 2 x http bakery cakephp org
  • INotifyPropertyChanged 和线程

    我有一个基类实现INotifyPropertyChanged protected void OnNotifyChanged string pName if PropertyChanged null PropertyChanged this
  • 使用 JSON 序列化 PictureBox

    我正在开发一个 C Windows 窗体应用程序项目 我需要使用 JSON 序列化 PictureBox 并将其保存到文件中 由于某种原因 JSON 在尝试序列化 PictureBox 时出现错误 Newtonsoft Json JsonS
  • 在 UserControl 中使用 BindingSource

    我有一个包含多个字段的 UserControl 我希望将其绑定到 BindingSource 我还希望 UserControl 公开一些 BindingSource 属性 以便可以将其放在表单上并绑定到表单上的 BindingSource
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • 如何在winform应用程序中生成产品收据?

    我第一次开发 winform 应用程序 我有一个 gridview 其中包含用户已购买的产品列表 我点击了一个 打印 按钮 允许用户生成如下收据 所以在这里我很困惑是否应该使用 winform默认RDLC或Crystal Report 或者
  • 如何在winform的中心设置控件?

    您好 我正在尝试在表单中心设置控件 即标签或文本框 当我最大化该形式时我需要这个 我可以静态或动态设置它吗 大家有什么想法请尽快告诉我 将控件放在中心并设置Anchor财产给None
  • 如何在 Windows 窗体中制作窗体模式?

    我正在尝试创建一个子表单 帮助用户在父表单中的字段中输入数据 我希望这个子表单是模态的 但是我需要做什么才能使这个表单成为模态 我需要使用其他类型的物品吗 Use Form ShowDialog http msdn microsoft co
  • DataGridView 数据绑定到 List>

    给定代码 class Foo public string Value get set public int Id get set List
  • File.ReadAllLines 或流读取器

    我们可以使用以下方式读取文件StreamReader http msdn microsoft com en us library vstudio system io streamreader或通过使用File ReadAllLines ht
  • 如何延迟关闭并在窗口服务中运行进程

    我必须在 Windows 关闭时运行一个进程 即应用程序 有什么方法可以延迟 Windows 关闭并在 Windows 服务中运行该应用程序 protected override void OnShutdown Add your save
  • 将下拉项定位在按钮 Flutter 下方

    我正在拼命寻找一种方法将项目放置在按钮下方 正如您所看到的 如果先前选择了第一项 则列表顶部与按钮处于同一级别 但是 如果我之前选择了最后一项 则下拉列表的位置使列表在按钮级别结束 这不是我想要的行为 我希望它始终位于第一个屏幕截图中 即使
  • 我可以双击 tkinter 列表框选项来调用 Python 中的函数吗?

    我有一个带有关联的 选择 按钮的列表框 我希望我的 GUI 能够双击任何列表框值来调用此按钮的命令 当选择一个选项并且用户双击窗口中的任何位置时 我的尝试 如下 有效 我希望它仅在双击选择本身 蓝色突出显示的行 时才起作用 做这个的最好方式
  • 对 .NET Windows 安装程序应用程序执行注册表搜索

    我有一个 NET winform 安装程序应用程序 在安装之前 我会进行注册表搜索以检查计算机上是否安装了 MS Access Runtime 搜索目标机器 搜索目标机器的属性 启动条件 启动条件的属性 但是我想避免对路径进行硬编码 例如
  • Svelte 路线给我 404

    我在 Svelte 中为我的应用程序创建了一个简单的路由器 如果我从导航栏访问链接 它就可以工作 如果我重新加载页面 它会给我 404 为什么
  • 为什么c#异常处理机制不捕获win32异常

    我有一个 winforms 应用程序 Winforms 从 Program cs 开始 我们在其中定义了 main 我已将此代码放在 try catch 块中 STAThread static void Main try Applicati
  • DatagridView 不显示错误图标或错误文本?

    我有一个带有 datagridview 的 win 表单 c 我将网格的数据源设置为数据表 用户想要检查数据表中的某些数据是否存在于另一个源中 因此我们循环遍历该表 将行与另一个源进行比较 并将数据表上的 rowerror 设置为一条短消息
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • Ruby:基于控制台的菜单

    我有一个名称和 URL 数组 并希望以向上 向下滚动菜单的形式向用户呈现名称列表 基本上是什么dialog允许在外壳内 我调查过ncurses ruby rdialog and HighLine但它们似乎要么作为一个项目被放弃 要么甚至从它

随机推荐

  • 如何在控制台应用程序中添加 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