为什么在 .net 中使用 Invoke on Controls? [复制]

2024-06-05

可能的重复:
为什么.NET不允许跨线程操作? https://stackoverflow.com/questions/2896504/why-net-does-not-allow-cross-thread-operations
为什么只允许UI线程修改UI? https://stackoverflow.com/questions/3794420/why-is-only-the-ui-thread-allowed-to-modify-the-ui

据我了解,.net 引发非法跨线程调用异常的原因是 GUI 可能会显示不确定的行为。

但其他所有物体不都是这样吗?如果两个线程处理同一个对象,则根据代码,该对象可能处于不确定的情况。那么为什么控制元素会存在这种异常呢?或者为什么这个异常是控制元素独有的。

使用 invoke 有什么帮助?它仍然是不确定的。


Invoke- 需要对其他线程进行控制,因为不允许跨线程调用控件 https://stackoverflow.com/questions/3794420/why-is-only-the-ui-thread-allowed-to-modify-the-ui。要更完整地讨论为什么存在此限制,您应该阅读该链接 - 我不会在这里回答这个问题,它只是is(不过请放心,此限制的存在是有充分理由的)。

Calling Invoke对我们有帮助,因为它允许后台线程在 UI 线程上“做事”——它之所以有效,是因为它不直接调用该方法,而是发送一个窗口消息 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644927%28v=vs.85%29.aspx上面写着“当你有机会时运行这个”。 UI 线程正在运行消息泵 https://stackoverflow.com/questions/2222365/what-is-a-message-pump它连续处理发送到该线程的所有消息 - 通常这些消息是这样的“用户点击了这个按钮” http://msdn.microsoft.com/en-us/library/windows/desktop/ms645607%28v=vs.85%29.aspx,在这种情况下,Windows 窗体通过引发Click相关控件上的事件。在这种情况下,Windows 窗体通过运行提供的委托来处理消息。

结果是在任何一个时间点只有 1 个线程正在修改/使用 UI 控件(UI 线程)。

注意Invoke http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx不保证代表的运行顺序。如果两名代表很重要Invoked如果两个不同的线程(甚至同一个线程)以正确的顺序执行,那么这是一个不同的问题。


Aside:我们谈论“UI 线程”是因为大多数应用程序都有一个线程,在该线程上创建所有控件,但实际上可以创建不同的控件线程 - 它是在处理消息的线程上创建控件的线程。显然,为了正确处理这些消息,必须在该线程上运行消息泵。

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

为什么在 .net 中使用 Invoke on Controls? [复制] 的相关文章

  • C++ win32 从资源加载字符串

    好吧 我最近决定将应用程序中的每个字符串放入 STRINGTABLE 中 这样我就可以轻松翻译成不同的语言 我知道如何使用 LoadString api 但这涉及我为要加载的每个字符串使用不同的变量 如果我的应用程序有 100 个字符串 那
  • PS3 上的 Mono 开发资源

    我一直在考虑冒险在我的 Playstation 3 上安装 Linux 由于 C 是我当前选择的语言 所以下一个合乎逻辑的步骤是安装 Mono 我做了一些研究发现http psubuntu com wiki InstallationInst
  • 如何将 Console.Readkey 转换为 int c#

    我正在尝试将用户输入键转换为 int 用户将输入 1 到 6 之间的数字 这是我到目前为止在方法中所拥有的 它不起作用 但抛出格式异常未得到处理 var UserInput Console ReadKey var Bowl int Pars
  • 对于位字段,使用 unsigned char 或 unsigned int 哪一个更好?为什么?

    我只想了解以下结构声明 哪一种更适合用于内存分配 为什么 如果是 unsigned char 和 unsigned int 那么填充又如何呢 struct data unsigned char a 3 unsigned char b 4 a
  • 根据现有值更改 dataGridView 中的值

    我正在重新制作我的客户拥有的应用程序 这意味着我没有创建原始应用程序 其中一个请求是简化 dataGridView 之一中显示的数据 数据是从现有数据库中提取的 问题在于 在该显示器使用的数据表中 其中一列代表某种产品的一种使用类型 并由普
  • 调用异步方法和 Task.Run 异步方法之间的区别

    我的视图模型中有一个方法 private async void SyncData SyncMessage syncMessage if syncMessage State SyncState SyncContacts this SyncCo
  • 我可以添加编译时检查以确保这是合法的处理程序函数吗? (受限通用)

    查看评论 我希望第二个 MapPost 调用在编译时失败 我只是在尝试使用 asp net 最小管道 我认为这需要受限泛型 但我是 C 新手 所以认为有人可以快速回答这个问题 希望如此 var router new ExampleRoute
  • 为什么 -Winit-self 与 -Wuninitialized 分开

    这个问题 https stackoverflow com q 22963405 10396是关于让 gcc 编译器在您输入错误并用自身初始化变量时发出警告 int f int i i return i 事实证明你需要 Winit self
  • 通过搜索字符串过滤 CollectionViewSource - 绑定到 itemscontrol (WPF MVVM)

    有没有办法可以过滤CollectionViewSource仅显示游戏ItemsSource哪个 标题 包含 searchString In my PosterView我有这个CVS
  • C# 中任务的 System.InvalidOperationException

    我试图通过使用任务 Parallel foreach 使我的代码更快 这是我更新的代码 int intImageW intImageH Bitmap bmpDest new Bitmap 1 1 DateTime creationTime
  • 关闭 Quartz .Net 中的调试日志记录

    我正在使用 Quartz NET 在我们的应用程序中安排一些自定义任务 一切工作正常 只是它在一秒钟内记录大约二十个调试条目 我不知道如何关闭调试日志记录 任何帮助将非常感激 因为我一直试图在网上查找但没有运气 调试条目如下所示 DEBUG
  • std::ofstream,写入前检查文件是否存在

    我正在实现文件保存功能Qt使用 C 的应用程序 我正在寻找一种方法来检查所选文件在写入之前是否已存在 以便我可以向用户提示警告 我正在使用一个std ofstream我并不是在寻找Boost解决方案 这是我最喜欢的隐藏功能之一 我随身携带以
  • 自动将 c++ dll 包装到 c# 中

    我想在 C 项目中使用 C 库 是否有任何包装工具可以自动导入所有类 SWIG http www swig org 可以帮助创建一个由两部分组成的包装器 一侧为 C 一侧为 C 不过 设置正确的生成文件需要一些工作 另一种需要更多手动编码的
  • WPF 绑定无法与 int 类型的属性正常工作

    我拥有以下财产int输入我的视图模型 该模型绑定到TextBox 一切正常 TwoWay绑定工作正常 除了一种情况 如果我清除的值TextBox 属性设置器不会被调用 尽管值已被清除TextBox 属性仍保持先前的值 有人遇到过类似的问题吗
  • C# 中带有复选框的 TreeView

    我在 C 中有一个带有复选框的树视图 我希望当用户检查一个节点时 自动检查以下级别上的所有节点 有谁知道如何做到这一点 而无需在每次用户检查某个节点时在所有树上运行递归功能 Thanks 该函数返回树视图 public TreeView G
  • 如何从 puppeteer-sharp 中获取可读的浏览器/页面错误?

    我正在使用 puppeteer sharp 将某些页面呈现为 PDF 我想知道页面在浏览器中运行时渲染时是否存在任何问题 因此我设置了一些事件处理程序 page Error sender args gt logger LogCritical
  • 来自网站但不来自控制台应用程序的 Web 服务调用中出现 EndpointNotFoundException

    我明白了EndpointNotFoundException在来自网站的 Web 服务调用上 而如果我从控制台应用程序执行此操作 则同样的调用也有效 以下是更详细的异常消息 Could not connect to https TCP err
  • 以编程方式添加超链接到列表项

    我想以编程方式获得以下 HTML ul li a href a li ul 我可以添加 li to ul But a to li 不可能 My code BulletedList ul new BulletedList ListItem l
  • catch(...) 没有捕获异常,我的程序仍然崩溃

    我的测试仪遇到问题 我的应用程序在初始化时崩溃 我添加了更多的日志记录和异常处理 但它仍然崩溃并显示通用的 此程序已停止工作 消息 而不是触发我的错误处理 鉴于我的 main 看起来像这样并且有catch 什么情况下不会触发 try sim
  • Web API 帮助页面显示每个方法的两个版本

    如何避免帮助页面显示我的方法的两个版本 正如你所看到的 我已经设置了一条自定义路线 api property search finnId 但我不希望使用查询参数的那个出现在 帮助 页面中 有办法解决这个问题吗 我正在使用 ASP NET F

随机推荐