UI Thread .Invoke() 导致句柄泄漏?

2023-11-27

在什么情况下,当使用委托和.InvokeRequired?

例如:

public delegate void DelegateUIUpdate();
private void UIUpdate()
{
    if (someControl.InvokeRequired)
    {
        someControl.Invoke(new DelegateUIUpdate(UIUpdate));
        return;
    }
    // do something with someControl
}

当在循环中或按计时器间隔调用此函数时,程序的句柄会持续增加。

EDIT:

如果将上述注释掉并修改为:

public delegate void DelegateUIUpdate();
private void UIUpdate()
{
    //if (someControl.InvokeRequired)
    //{
    //   someControl.Invoke(new DelegateUIUpdate(UIUpdate));
    //    return;
    //}
    CheckForIllegalCrossThreadCalls = false;
    // do something with someControl
}

...然后是手柄stop递增,但是当然我不想允许跨线程调用。

EDIT 2:

这是显示手柄增加的示例:

Thread thread;
private delegate void UpdateGUI();
bool UpdateTheGui = false;

public Form1()
{
    InitializeComponent();

    thread = new Thread(new ThreadStart(MyThreadLoop));
    thread.Start();
}

private void MyThreadLoop()
{
    while (true)
    {
        Thread.Sleep(500);
        if (UpdateTheGui)
        {
            UpdateTheGui = false;
            UpdateTheGuiNow();
        }
    }
}

private void UpdateTheGuiNow()
{
    if (label1.InvokeRequired)
    {
        label1.Invoke(new UpdateGUI(UpdateTheGuiNow));
        return;
    }

    label1.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
    label2.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
    label3.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
}

private void btnInvoke_Click(object sender, EventArgs e)
{
    UpdateTheGui = true;
}

我也遇到了同样的问题

this.Invoke(new DelegateClockUpdate(ChangeClock), sender, e);

每个调用创建一个句柄。

句柄会递增,因为 Invoke 是同步的,并且句柄实际上已保持挂起状态。

应该使用等待句柄来处理结果,或者使用异步 BeginInvoke 方法,如下所示。

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

UI Thread .Invoke() 导致句柄泄漏? 的相关文章

随机推荐

  • 如何调试 React Native?

    当应用程序在应用程序模拟器中运行时 如何使用 React Native 调试其 React 代码 Mac Cmd M Windows and Linux Ctrl M 在模拟器中使用上面适当的热键 它将弹出 Chrome 您可以从那里使用开
  • erlang 记录进程何时启动吗?

    我正在监视 Erlang 应用程序 目前正在尝试确定特定 PID 运行了多长时间 绝对时间戳或持续时间对我有用 但我在 process info 中或通过 sys 模块看不到这些数据位 有没有办法从 Erlang VM 中获取这些信息 我可
  • 将参数传递给 TADOStoredProc 的更好方法 (Delphi)

    我需要将大量的 SQL 查询转换为存储过程 我有一些代码可以在一个 Delphi 过程中一次更新大约 20 或 30 个值 我可以创建一个存储过程来完成这样的事情 问题是我将参数传递给存储过程的方法非常庞大 如下所示 with stored
  • __getattr__ 用于静态/类变量

    我有一堂课 比如 class MyClass Foo 1 Bar 2 每当MyClass Foo or MyClass Bar被调用时 我需要在返回值之前调用一个自定义方法 在Python中可以吗 我知道如果我创建该类的实例并且可以定义自己
  • 如何使用 Grails 将文件存储在数据库中

    我需要使用 Grails 在数据库中存储文件 那么 你知道我该怎么做吗 我应该在域类中使用哪种数据类型 byte 可能是一个解决方案 请参阅中的 上传文件 一章Grails 用户指南 还可以使用 java sql Blob 作为二进制内容的
  • 调用“Users.messages: list”时,Gmail API 按什么顺序返回消息

    根据Gmail API 参考 Users messages 列出 列出 用户邮箱中的邮件 根据我的观察 消息按数据降序返回 这是一个正确的假设吗 基本上 我希望能够在几天后处理用户的收件箱 而无需重新处理我已经处理过的邮件 一旦我偶然发现一
  • 列出某个区域或可用区中的所有 EC2 实例类型 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 虽然似乎有几种方法可以将一些 AWSCLI 命令输出和过滤到此列表中 但是否有人有一种很好 简单的方法来列出特定区域的所有 EC2 实例类型 或者该
  • R Markdown:在“参考文献”部分之后放置附录?

    我正在使用 R Markdown 编写一份报告 其中包含参考文献 问题是 R markdown 自动将引用放置在报告的末尾 我想在参考文献之后添加附录 有什么办法吗 我看到可以用子文档但我希望一切都以独特的方式呈现 Rmd file 下面是
  • Python - 是否可以“停止”或“暂停”线程

    我有两个线程 并且 我希望一个线程运行 10 秒 然后让该线程停止 同时另一个线程执行 然后第一个线程再次启动 重复这个过程 所以例如 from threading import Thread import sys import time
  • Xampp访问禁止php

    我是 Windows 用户 我已经使用 xampp 有一段时间了 但突然我的 php 文件现在都不起作用了 我收到此错误消息 禁止访问 您无权访问所请求的对象 它要么是读保护的 要么是服务器无法读取的 如果您认为这是服务器错误 请联系网站管
  • c 数组:动态设置大小?

    我是 C 编程新手 我试图使用变量设置数组的大小 但出现错误 数组 的存储大小不是恒定的 01 int bound bound 4 02 static GLubyte vertsArray bound 我注意到当我更换时bounds 在第
  • .NET 5 使用 Windows Shell 的方式是什么? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我最近将一些软件项目移至 NET 5 我使用 Microsoft WindowsAPICodePack 来与 Windows Shell 配合使用 但该库已经过时 似乎不再维护 此外 它是
  • 如何添加迄今为止的天数

    我想得到给定日期的第二天 午夜 到目前为止我正在使用 givenDate Add time Hour time Duration 24 问题是某些时区如果我添加 24 小时 我就会在同一天停留 在法国 他们偶尔会改变工作时间 使用以下内容添
  • 在 iPy Notebook 中运行 unittest 示例时出现 AttributeError

    我是 iPython 的新手 试图帮助其他开发人员入门 但我们都遇到了同样的问题 我们正在尝试在 iPython 中运行 python 单元测试示例https docs python org 2 library unittest html
  • 原则 2:拯救复杂关系中的实体

    我的学说实体中有以下关系 最喜欢的食谱 ManyToOne targetEntity User inversedBy favoriteRecipes private user ManyToOne targetEntity Recipe in
  • 即使指针从未被取消引用,过数三指针中的硬件陷阱是如何发生的?

    In his 2005 年 11 月 1 日 C 专栏 赫伯 萨特写道 int A 17 int endA A 17 for int ptr A ptr lt endA ptr 5 O 在某些 CPU 架构中 包括 当前的 上述代码 可能会
  • 如何使用 Parcel 2 在 React 中内联使用 SVG?

    以前在 Parcel v1 中 您可以使用类似 svgr parcel plugin svgr包裹插件 这将使您能够像使用 CRA 一样内联使用 SVG import Star from star svg const App gt div
  • 块和保留循环中的弱引用

    在这个问题中 我询问了以下代码和保留周期 weak Cell weakSelf self NSBlockOperation op NSBlockOperation blockOperationWithBlock UIImage image
  • PHP 中的“function”、“use”和“array_filter”如何工作?

    我熟悉创建放置在 php 文件顶部的 PHP 函数 例如 function my little function parm1 parm2 if parms lt parm2 return yes else return no 然后像这样调用
  • UI Thread .Invoke() 导致句柄泄漏?

    在什么情况下 当使用委托和 InvokeRequired 例如 public delegate void DelegateUIUpdate private void UIUpdate if someControl InvokeRequire