向 Windows 窗体消息循环发送或发布消息

2024-04-16

我有一个线程从命名管道读取消息。它是阻塞读取,这就是它在自己的线程中的原因。当该线程读取消息时,我希望它通知主线程中运行的 Windows 窗体消息循环消息已准备就绪。我怎样才能做到这一点?在win32中我会做一个PostMessage,但是.Net中似乎不存在该函数(或者至少我找不到它)。


在 WinForms 中你可以通过以下方式实现这一点Control.BeginInvoke http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx。一个例子:

public class SomethingReadyNotifier
{
   private readonly Control synchronizer = new Control();

   /// <summary>
   /// Event raised when something is ready. The event is always raised in the
   /// message loop of the thread where this object was created.
   /// </summary>
   public event EventHandler SomethingReady;

   protected void OnSomethingReady()
   {
       SomethingReady?.Invoke(this, EventArgs.Empty);
   }

   /// <summary>
   /// Causes the SomethingReady event to be raised on the message loop of the
   /// thread which created this object.
   /// </summary>
   /// <remarks>
   /// Can safely be called from any thread. Always returns immediately without
   /// waiting for the event to be handled.
   /// </remarks>
   public void NotifySomethingReady()
   {
      this.synchronizer.BeginInvoke(new Action(OnSomethingReady));
   }
}

上面的一个更干净的变体不依赖于 WinForms 是使用SynchronizationContext. Call SynchronizationContext.Current http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.current.aspx在主线程上,然后将该引用传递给如下所示的类的构造函数。

public class SomethingReadyNotifier
{
    private readonly SynchronizationContext synchronizationContext;

    /// <summary>
    /// Create a new <see cref="SomethingReadyNotifier"/> instance. 
    /// </summary>
    /// <param name="synchronizationContext">
    /// The synchronization context that will be used to raise
    /// <see cref="SomethingReady"/> events.
    /// </param>
    public SomethingReadyNotifier(SynchronizationContext synchronizationContext)
    {
        this.synchronizationContext = synchronizationContext;
    }

    /// <summary>
    /// Event raised when something is ready. The event is always raised
    /// by posting on the synchronization context provided to the constructor.
    /// </summary>
    public event EventHandler SomethingReady;

    private void OnSomethingReady()
    {
        SomethingReady?.Invoke(this, EventArgs.Empty);
    }

    /// <summary>
    /// Causes the SomethingReady event to be raised.
    /// </summary>
    /// <remarks>
    /// Can safely be called from any thread. Always returns immediately without
    /// waiting for the event to be handled.
    /// </remarks>
    public void NotifySomethingReady()
    {
        this.synchronizationContext.Post(
                state => OnSomethingReady(),
                state: null);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向 Windows 窗体消息循环发送或发布消息 的相关文章

随机推荐

  • java 文件名中带有美元符号和数字 .class (name$1.class) 是什么意思? [复制]

    这个问题在这里已经有答案了 当我编译我的java Enum Day时 它生成他的Day class文件和8个Day class文件 所以我想知道为什么编译器生成8个 class而不是7个 因为我有7个枚举常量 但是8 个覆盖注释 我知道 D
  • Google Play 定时发布

    在 Google Play 上使用 定时发布 更新应用程序时 上传 APK 后 是否应该选择 立即发布到生产环境 选项 这会将新的 APK 提交到生产环境吗 还是 Google Play 会直接处理它并等待我点击 上线 Google 或其他
  • Laravel 5 - 如何在视图中访问存储中上传的图像?

    我已将用户的头像上传到 Laravel 存储中 我如何访问它们并将它们呈现在视图中 服务器将所有请求指向 public 那么如果他们在的话我该如何向他们展示 storage folder The best方法是创建一个符号链接就像 Slat
  • bin目录和PATH

    我是编程初学者 有人可以解释一下 用简单的话 程序的 bin 目录中有什么吗 这是什么PATHwindows的环境变量 它是如何工作的 请不要以为我不会使用Google 我只是想更清楚地理解它 通常将程序的所有二进制文件放在 bin 目录中
  • CakePHP 总是让我退出

    最近我制作了三个蛋糕应用程序 这三个应用程序都有这个问题 配置大部分是库存的 我使用它作为会话选项 Configure write Session array defaults gt php cookie gt test 经过大量谷歌搜索后
  • 通过在 datagridviewcolum 中指定 DefaultCellStyle.Format 值来显示百分比

    With datagridview Columns PricePerUnit ValueType Type GetType System Decimal DefaultCellStyle Format C End With 数据表绑定到 d
  • 从数据库中检索图像

    我正在开发一个显示员工列表的项目 此处将显示该员工的信息和照片 我的项目现在可以在列表框中显示员工列表 当我双击员工时 他 她的个人资料将显示在文本框中 我的问题是我无法让他们的照片显示在picturebox 我已经将他们的照片以及他们的
  • 绘制 dr4pl 剂量反应曲线,以及如何将它们与 ggplot2 集成?

    我正在尝试建立一种高通量方法来绘制大型筛选实验的剂量反应曲线 Prism 显然有最简单的方法可以很好地绘制剂量反应曲线 但我无法复制和粘贴这么多数据 自从 CRAN 被移除后drc 包dr4pl似乎是可行的方法 但目前可用的指导还很少 ma
  • 在python中解压嵌套的zip文件

    我正在寻找一种在 python 中解压缩嵌套 zip 文件的方法 例如 考虑以下结构 为方便起见 使用假设名称 Folder ZipfileA zip 压缩文件A1 zip 压缩文件A2 zip ZipfileB zip 压缩文件B1 zi
  • 在 C 中将整数转换为二进制

    我正在尝试将整数 10 转换为二进制数 1010 此代码尝试执行此操作 但我在 strcat 上遇到段错误 int int to bin int k char bin bin char malloc sizeof char while k
  • 为多面图中的单个面板添加几何图层

    从以下链接中获取提示使用 ggplot2 对齐两个图 http rwiki sciviews org doku php id tips graphics ggplot2 aligntwoplots 我能够根据共同的 x 轴绘制 2 个 y
  • 流明:启用 CORS

    我使用 Lumen 构建了一个 API 并希望使用 JavaScript 和 XMLHttpRequest 对象访问它 但每次我的 PUT GET POST 和 DELETE 请求都会转化为选项 请求 我看了很多网站都有CORS的信息 我构
  • 点击按钮后 Python Tkinter 销毁标签

    我有一个在单击按钮后出现的标签 但是每次单击按钮后 前一个标签仍保留在其位置并创建一个新标签 我希望将新标签代替旧标签 代码如下 browser webdriver PhantomJS browser get http www ipvoid
  • iPhone硬计算和缓存

    我有问题 我有数据库500k记录 每个记录存储纬度 经度 动物种类 观察日期 我必须在 Mapkit 视图上方绘制网格 15x10 以显示该网格单元中物质的浓度 每个单元格都是 32x32 的盒子 如果我在运行时计算它是非常slow 有人知
  • Cocoa:如何将布尔属性绑定到 NSCellStateValue?

    我想绑定布尔值enabled的财产NSTextField到一个状态NSButton 我已经尝试添加自定义NSValueTransformer从而改变了状态NSButton into NSNumber 但是 在这种情况下 由于某种原因 文本字
  • 有没有办法通过命令行将 JVM 参数传递给 Maven? [复制]

    这个问题在这里已经有答案了 可能的重复 Maven Jetty 插件 如何控制 VM 参数 https stackoverflow com questions 2007192 maven jetty plugin how to contro
  • 如何在 Java 中对 HTTP 请求中的西里尔字母进行编码?

    美好时光 我的 Adroid 应用程序向 Google 的 API 服务之一执行 HTTP 请求 当然 当请求的参数是英文时 它可以工作 但是当我用西里尔文测试我的函数时 我收到 400 错误 似乎问题是将 Win 1251 字符串编码为
  • 将数据从 Azure HUB-IOT 保存到 Azure SQL 数据库

    我最近创建了一个 Azure Hub IOT 其中我从虚拟设备发送一些数据 我知道数据已到达 因为我可以从终端看到它们 但现在我想获取这些数据并将它们保存到 Azure SQL DataBase 中 我怎样才能做到这一点 如果有人可以向我解
  • 如何 git Blame 目录

    我想知道如何使用 gitblame 来知道谁创建了单个目录 当我尝试时 git blame DIRECTORY NAME I get fatal no such path DIRECTORY NAME in HEAD 顺便说一句 该目录是空
  • 向 Windows 窗体消息循环发送或发布消息

    我有一个线程从命名管道读取消息 它是阻塞读取 这就是它在自己的线程中的原因 当该线程读取消息时 我希望它通知主线程中运行的 Windows 窗体消息循环消息已准备就绪 我怎样才能做到这一点 在win32中我会做一个PostMessage 但