首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在.NET中的非UI线程中实现消息泵?

如何在.NET中的非UI线程中实现消息泵?
EN

Stack Overflow用户
提问于 2010-04-10 15:50:58
回答 5查看 4.5K关注 0票数 1

我正在读这个博客:正确使用线程,我想知道:

如何在非UI线程中实现消息(注释:我不是指Windows这里的)?

我想要的是消息可以是一个对象或命令,比如Action<T>/Func<T>,等等。对于不同类型的消息,我必须使用不同的队列吗?假设对象有一个队列,Action<T>/Func<T>有一个队列

考虑到消息的类型不同,如何实现它?

编辑:

我想要完成的是一个生产者/消费者模型,生产者/消费者共享队列进行通信,队列不仅可以包含对象供消费者使用,还可以将一些‘命令’传递给使用者执行。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-10 21:17:14

使这成为代码格式化的单独答案。

好的,在阅读您的更新之后,我想您想要的是我在“第二种情况”中所描述的--您只是想要

代码语言:javascript
代码运行次数:0
运行
复制
Broadcast<T>("Foo") 

其中T是代表。

那么你的消费者就会

代码语言:javascript
代码运行次数:0
运行
复制
Subscribe<T>("Foo",HandlerMethod)

因此,生产者消费者场景将如下所示

代码语言:javascript
代码运行次数:0
运行
复制
internal static class MessagePump
    {

        public static void Subscribe<T>(String foo, Action<String> handlerMethod)
        {
            throw new NotImplementedException();
        }

        public static void BroadcastMessage<T>(String foo, Action<String> someAction)
        {
            throw new NotImplementedException();
        }
    }

    public class Producer
    {
        void SendMessage()
        {
            MessagePump.BroadcastMessage<Action<String>>("Foo", SomeAction);
        }

        void SomeAction(String param)
        {
            //Do Something
        }
    }


    public class Consumer
    {

        public Consumer()
        {
            MessagePump.Subscribe<Action<String>>("Foo", HandlerMethod);
        }

        void HandlerMethod(String param)
        {
            // Do Something
        }

    }

这只是我头上的一些东西,是一个精心设计的例子,所以,用一点盐来看吧。这几乎正是我正在做的快递框架,我早些时候发布的。您可能需要深入研究该代码,以获得一个更具体的实现示例。

您需要考虑如何管理使用者,如何验证广播和订阅,以及如何确保正确地调用正在传递的委托?还是你在乎?

这个有用吗?

票数 1
EN

Stack Overflow用户

发布于 2010-04-10 17:55:50

术语“消息泵”专门指Windows中的GUI线程(即使它们实际上没有创建GUI)。

听起来可能您是在讨论消息,但是即使消息队列也不会接受操作或函数,它会接受特定类型的消息。

我肯定从未听说过将Func<T>传递给消息队列--结果将如何处理?你要把它藏在什么地方吗?给打电话的人发个信息?对我来说似乎没什么用。

不管你想要做什么,听起来都是由内置的.NET线程池来处理的。这实际上是为异步执行代码而设计的,而不是排队和处理消息。

票数 2
EN

Stack Overflow用户

发布于 2010-04-10 17:18:08

在启动线程之前,需要Thread.SetApartmentState()将线程切换到STA,然后在线程函数中调用Application.Run()来启动消息循环。

不过,这与Action代表没有任何关系。消息队列是存储鼠标和键盘消息的内部Windows结构。存储自己的物品是不合适的。不知道你想把这个带到哪里去。

常规System.Collections.Generic.Queue<>对象可以存储任何类型的对象,包括表示“命令”的类的对象。使用ReaderWriterLockSlim使其线程安全。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2613932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档