.net - 为什么 Control.Invoke 是必要的?

标签 .net multithreading

Control.Invoke在拥有控件的底层窗口句柄的线程上执行指定的委托(delegate)。

多年来,我只是接受这是必须的方式,但我一直不明白为什么。

我唯一能想到的就是代码是非常不安全的线程,而不是仅仅在控制代码中添加一点同步,框架只是不允许它并迫使我们走这条路——把婴儿和洗澡水一起扔出去!

  • 纯粹是微软的懒惰,还是我没有得到什么?
  • 其他编程框架/其他操作系统是否有类似的问题,还是只是 Windows 的问题?
  • 除了更改我们应用程序中的每个功能之外,还有其他方法吗?
  • 最佳答案

    这是底层 Windows 用户界面的限制,与 .NET 框架本身几乎没有关系。在控件和窗口上执行许多操作(在 Windows 意义上,而不是组件模型意义上)需要在创建窗口句柄的线程上执行这些操作。 .NET 框架与任何其他应用程序一样,必须遵守此规则。

    当然,微软可以在框架中加入同步来防止这个问题,但是这样做会为不需要该功能的应用程序增加大量的性能开销(因为它们主要是单线程的)。

    微软的决定是强制那些需要开销的人明确地管理它,而不是把它强加给每个人。

    关于.net - 为什么 Control.Invoke 是必要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973725/

    相关文章:

    java - 在鼠标按下事件中启动 "asyncExec"会导致阻塞行为

    java - ThreadFactory 和 newThread(Runnable r) 如果它是线程,如何访问 r 的属性?

    java - 获取三维数组的两个维度 C#

    .net - 使用Javascript过滤div的 "list"

    c# - C# 和 javascript 中的正则表达式

    java - Java线程中的消息对话

    c# - 为什么这个线程示例根本不可预测(每次输出不同的结果)?

    .net - ASP.NET 中的计时问题

    .net - Ruby on Rails 与 .NET 集成的状况如何?

    java - 如何创建生产者/消费者线程模式?