Control.BeginInvoke 是否有一个变体可以在句柄被销毁之前/之后工作?

2024-04-15

我有一个显示底层异步对象状态的控件。该对象引发事件,这些事件到达表单,在那里它们基本上排队并最终使用 BeginInvoke 进行调用。

当控件被废弃时就会出现问题。因为事情是异步发生的,这意味着事件回调在处理过程中总是可能排队,所以我有时会收到 InvalidOperationException(在创建窗口句柄之前无法在控件上调用 Invoke 或 BeginInvoke)。

这不是我想要的行为。我希望即使控件已被释放,回调也能执行(即使这会导致回调中出现异常;这对我来说是一个更有用的异常!)。我想处理每个回调中的已处置状态行为(通常如果已处置则跳过,但有时不是[例如,一个控件记录事件(可选到文件),并且我不想丢失日志数据!]。)。

有没有一种方法可以按照我想要的方式工作?我可以自己写一个不易碎的吗?


Try SynchronizationContext.Current反而。这有Post and Send成员其中roughly map to BeginInvoke and Invoke on Control。只要 UI 线程相对于特定控件处于活动状态,这些操作就会继续运行。

方式SynchronizationContext并非特定于 WinForms,利用它的解决方案可以移植到其他框架,例如 WPF。

例如。

开始调用代码

void OnButtonClicked() {
  DoBackgroundOperation(this); 
}

void DoBackgroundOperation(ISynchronizedInvoke invoke) {
  ThreadPool.QueueUserWorkItem(delegate { 
    ...
    delegate.BeginInovke(new MethodInvoker(this.BackgroundOperationComplete), null);
  });
}

同步上下文代码

void OnButtonClicked() {
  DoBackgroundOperation(SynchronizationContext.Current);
}

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

Control.BeginInvoke 是否有一个变体可以在句柄被销毁之前/之后工作? 的相关文章

  • 如何使用 winforms 在 vb.net 中制作大型按钮网格(24x20 或类似)?

    我正在 vb net WinForms 中制作一个座位预订系统 我需要用户能够选择他们想要使用的座位并改变颜色 这样他们就可以知道它已选择 我开始尝试使用按钮 但 480 个按钮严重减慢了表单的加载时间 然后我尝试了在行 列中带有按钮的数据
  • .NET Core == .NET Framework 5 吗?

    我一直在寻找书籍来研究最新的 NET Framework 据我所知 NET 最高为 4 6 但 ASP NET 最高为 5 核心 NET Core 是 NET 5 的名称还是我们目前仍使用 NET 4 6 去引用斯科特 汉塞尔曼 http
  • C# 要么返回 false 要么什么也不做

    我想知道是否有办法不必重复相同的事情如果施工而是调用一个状态检查 成功后无法返回true 有人知道这个问题更好的标题吗 bool Enable if GetStatus ref status Trace WriteLine Error re
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 类似于 .NET Framework 2.0 的 MEF(托管可扩展性框架)

    我在自己的项目中使用了 MEF 并且非常喜欢它 这很容易 在弄清楚我们的awkwardAPI模型 它刚刚工作了 现在我需要 NET Framework 2 0 类似的东西 有没有可以在 NET Framework 2 0 下工作的类似项目
  • 正则表达式的命名空间不起作用

    我正在翻新一些曾经在 NET Framework 3 5 上运行的旧代码 使其能够使用 C 在 NET Framework 4 上运行 以下正则表达式过去在 3 5 版本中运行良好 但由于某些奇怪的原因不再运行 public static
  • 如何禁用 Alt + F4 关闭表单?

    What is the best way to disable Alt F4 in a c win form to prevent the user from closing the form 我使用表单作为弹出对话框来显示进度条 但我不希
  • 如何完全禁用签名程序集?

    我有一个包含多个项目的 VS NET 2010 解决方案 我刚刚添加了一个新的库项目 the library assembly 启动项目是一个网站 当我运行该网站时 出现以下错误 无法加载文件或程序集 the library assembl
  • Ruby 中的任务/未来

    代表潜在延迟的异步计算并且可以订阅其完成的模式的惯用 Ruby 模拟是什么 即类似于 NET 的东西System Threading Task 或Python 3 xconcurrent futures future 请注意 这并不一定意味
  • 以编程方式更改 DataGridView 行上的只读模式

    在不解释整个上下文的情况下 我的问题基本上是这样的 我在 Windows 窗体上有一个 datagridview 它绑定到实体框架 DbSet dbSet
  • 在 Azure 上运行 .NET 应用程序

    我拥有在 Amazon EC2 上运行应用程序的丰富经验 它需要一台低端服务器 我目前为该服务器支付大约 90 美元 月 是的 我知道我并不真正需要可扩展性 但我仍然使用 EC2 我想知道将这个纯粹的 NET 应用程序迁移到 Microso
  • 处理双 NaN 和 Inf 时的 ILASM 问题

    我创建了一个简单的程序 并初始化了双精度类型值 var a double NaN 我使用 Visual Studio 2019 net Framework 4 5 构建项目 并使用 ILDASM exe 版本 4 0 30319 0 将其反
  • default(CancellationToken) 如何有对应的 CancellationTokenSource

    当我创建默认值时CancellationToken我可以在调试器中看到CancellationToken has a CancellationTokenSource与其关联的存储在私有中m source field 我想知道对于结构来说怎么
  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 如何在不使用 extern crate 的情况下导入 Rust 2018 中的所有宏、派生宏和过程宏?

    我正在尝试铁锈版 2018 https rust lang nursery github io edition guide rust 2018 index html 在 Rust 2015 中你使用 macro use extern cra
  • IEnumerable 如何在后台工作

    我正在徘徊于更深入的功能IEnumerable
  • 如何在 Java 中创建安全的随机 AES 密钥?

    使用标准 JDK 在 Java 中生成安全 随机 AES 密钥的推荐方法是什么 在其他帖子中 我发现了这一点 但是使用SecretKeyFactory可能是一个更好的主意 KeyGenerator keyGen KeyGenerator g
  • 如何将文件从 JavaScript 发送到 Java WebService

    我有一个使用 Cordova 的 HTML5 应用程序 您可以从您的设备上传文件 图像和视频 我必须将用户上传的文件发送到Java WebService 然后将其上传到服务器 我需要帮助 因为我无法实现我想要的 我尝试了在互联网上找到的几种
  • 在方法中使用索引签名 - Typescript 3.5

    interface Keys key string any const obj Keys trimDescription text string length number string return text length gt leng
  • Swift 中的阶段 1 和阶段 2 初始化

    这是 Apple Swift 文档的副本 一旦超类的所有属性都有初始值 它的内存被认为已完全初始化 并且阶段 1 已完成 超类的指定初始化器现在有机会 进一步自定义实例 尽管不是必须的 一旦超类的指定初始化器完成 子类的指定初始化器可以执行
  • 使用 jQuery AJAX 发送多个数据参数

    我正在向 php 文件发送 ajax 请求 如下所示 function checkDB code userid ajax type POST url profile check code php data code code userid
  • iOS UITextField Swift 中的下划线样式

    我添加了这张用户界面登录图像 希望您能看到 请注意 除了底部的线条之外 文本字段是透明的 我需要输入什么代码才能产生这种效果 我可以将必要的信息放入 用户定义的运行时属性 中吗 创建一个子类UITextField如下所示 只需在故事板中将此
  • 克隆存储库后,Azure DevOps 强制 core.hooksPath

    我尝试实施客户端 git hooks到 azure devops git 存储库 我添加了一个 githooks目录到根目录并实施pre commit钩 我提交所有内容并将其推送到存储库 但当然 只有当我执行时 钩子才会激活 git con
  • 使用 Node.js 和 mongo 设置单例连接

    以前我使用 mongodb 和 php 来查询我使用单例的数据库 这样我只实例化连接一次 然后重复使用它 class MDB protected static instance public static function use if s
  • 如何在 Cucumber-JVM 中明确匹配这些步骤?

    有什么方法可以明确匹配以下步骤吗 And I should have 2 alerts And I should have 2 alerts with param 71 我将它们实现为 And I should have d alerts
  • 使用 file.show 在 R studio 中打开 PDF

    我正在制作一个在 Swirl 中在 R 中运行的 R 教程 我正在尝试在 R 中打开特定的 PDF 文件 我在用 file show paste getwd cv pdf sep title some title 但显示是这样的 它不显示
  • Growl 通知:如何从网站推送 Growl 通知?

    我想知道如何将桌面 Growl 通知从我的 Web 应用程序推送给我的 Web 应用程序的用户 如果可能的话 我想使用 javascript 否则像 Ruby 或 PHP 这样的语言将是我的第二选择 您以前实施过类似的事情吗 如何做呢 我弄
  • 从列表中删除 nan - Python

    我试图从列表中删除 nan 但它拒绝删除 我尝试过 np nan 和 nan 这是我的代码 ztt for i in z if i nan ztt append i ztt or ztt for i in z if i np nan ztt
  • Feedparser 到数据框不输出所有列

    我从 feedparser 解析 URL 并尝试获取所有列 但我没有将所有列作为输出 不确定问题出在哪里 如果执行下面的命令 我没有获得几列的数据 但数据确实存在 您可以在浏览器中查看 my code import feedparser i
  • 左连接查询的 LINQ Fluent API 版本

    我目前有一个运行良好的 LINQ 查询 但我想知道如何将其转换为 LINQ Fluent API 格式 我尝试在 Google 上搜索有关 Fluent API 的不错的教程 尝试自己学习 但似乎没有 这是我要转换的查询 from s in
  • Jersey 2 多部分表单数据注入源

    我有一个方法 POST Consumes multipart form data Produces text xml public Response processForm FormDataParam myparam InputStream
  • RabbitMQ 失败,错误:无法连接到节点rabbit@TPAJ05421843:nodedown

    在 Windows 7 Enterprise 计算机上 我全新安装了 Erlang 17 4 和 RabbitMQ 3 4 3 x64 安装成功且顺利 我还没有尝试创建我的第一个队列或交换器 但我已经看到了麻烦 这个问题类似于另一个SO帖子
  • 不将数据保存到文档方向

    我尝试将数据保存到文档目录中 我没有收到任何错误 但它从不保存数据 它总是说 文件不存在 创建它 let fileManager FileManager default if let documentsDirectory fileManag
  • Control.BeginInvoke 是否有一个变体可以在句柄被销毁之前/之后工作?

    我有一个显示底层异步对象状态的控件 该对象引发事件 这些事件到达表单 在那里它们基本上排队并最终使用 BeginInvoke 进行调用 当控件被废弃时就会出现问题 因为事情是异步发生的 这意味着事件回调在处理过程中总是可能排队 所以我有时会