Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在.NET中的非UI线程中实现消息泵?

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

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

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

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

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

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

编辑:

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

EN

回答 5

Stack Overflow用户

回答已采纳

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

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

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

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

其中T是代表。

那么你的消费者就会

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 09:55:50

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

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

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

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

票数 2
EN

Stack Overflow用户

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

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

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

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

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

https://stackoverflow.com/questions/2613932

复制
相关文章
flutter - 如何在SingleChildScrollView中实现非滚动 ListView
我试图在这里实现一个不可滚动的ListView构建器,但似乎找不到解决方法。原因是因为我希望所有内容都是可滚动的,并且我不想在可滚动的父级中拥有可滚动的小部件。
徐建国
2021/08/03
2.4K0
如何在MQ中实现支持任意延迟的消息?
定时消息与延迟消息在代码配置上存在一些差异,但是最终达到的效果相同:消息在发送到 MQ 服务端后并不会立马投递,而是根据消息中的属性延迟固定时间后才投递给消费者。
林一
2018/07/24
6.1K3
如何在MQ中实现支持任意延迟的消息?
Android NDK中的UI线程
在Android中,UI线程是一个很重要的概念。我们对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。
Oceanlong
2018/10/29
2.6K0
如何在Dynamo中创建UI
本文介绍了如何在Dynamo中创建UI,通过使用WPF技术实现了窗口的创建和交互。首先介绍了IronPython和Dynamo的基础知识,然后讲解了实现原理和准备工作。最后通过具体的操作步骤和代码示例讲解了如何在Dynamo中创建UI。
企鹅号小编
2018/01/05
2.1K0
如何在Dynamo中创建UI
.NET 中的轻量级线程安全
2018-01-14 12:46
walterlv
2018/09/18
1.1K0
win10 uwp 非ui线程访问 ui
大家都知道,不可以在 其他线程访问 UI 线程,访问 UI 线程包括给 依赖属性设置值、读取依赖属性、调用方法(如果方法里面修改了依赖属性)等。一旦访问UI线程,那么就会报错,为了解决这个问题,需要使用本文的方法,让后台线程访问 UI 线程。
林德熙
2019/03/13
5460
win10 uwp 非ui线程访问 ui
大家都知道,不可以在 其他线程访问 UI 线程,访问 UI 线程包括给 依赖属性设置值、读取依赖属性、调用方法(如果方法里面修改了依赖属性)等。一旦访问UI线程,那么就会报错,为了解决这个问题,需要使用本文的方法,让后台线程访问 UI 线程。
林德熙
2018/09/18
1.1K0
.NET 中缓存的实现
在实际开发中我们经常会用到是缓存。它是的核心思想是记录过程数据重用操作结果。当程序需要执行复杂且消耗资源的操作时,我们一般会将运行的结果保存在缓存中,当下次需要该结果时,将它从缓存中读取出来。 缓存适用于不经常更改的数据,甚至永远不改变的数据。不断变化的数据并不适合缓存,例如飞机飞行的GPS数据就不该被缓存,否则你会得到错误的数据。
喵叔
2021/12/01
8690
WPF中UI元素跨线程访问
dotnet中线程资源独占UI元素,不能跨线程访问,可以通过Dispatcher.Invoke的方式调用,但实际处理还是UI线程中,任务量比较大的数据会增加线程的处理压力。 其实还有一种做法,可以通过设置UI元素为只读的方式,跨线程访问。 如BitmapSource跨线程访问,可以调用Freeze设置元素为只读模式。 Aforge.net跨线程传递图像资源,如下:
sofu456
2019/07/09
1.1K0
如何让Task在非线程池线程中执行?
Task承载的操作需要被调度才能被执行,由于.NET默认采用基于线程池的调度器,所以Task默认在线程池线程中执行。但是有的操作并不适合使用线程池,比如我们在一个ASP.NET Core应用中承载了一些需要长时间执行的后台操作,由于线程池被用来处理HTTP请求,如果这些后台操作也使用线程池来调度,就会造成相互影响。在这种情况下,使用独立的一个或者多个线程来执行这些后台操作可能是一个更好的选择。
蒋金楠
2023/05/31
7970
如何让Task在非线程池线程中执行?
.NET中Thread、Task或Parallel实现多线程的使用总结
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。本文主要介绍.NET(C#) 中使用Thread、Task或Parallel实现多线程的总结,以及相关的示例代码。
郑子铭
2023/08/30
4760
.NET中Thread、Task或Parallel实现多线程的使用总结
如何在 Ubuntu 中禁用 motd 欢迎消息
Ubuntu 使用的是update-motd,它是一个动态 motd 生成工具。从手册页: UNIX/Linux 系统管理员通常通过在文件 /etc/motd 中维护文本来向控制台和远程用户传达重要信息,该文件由 pam_motd(8) 模块在交互式 shell 登录时显示。
用户8989785
2021/09/13
2.3K0
Java中实现线程的方式
Java中实现多线程的方式的方式中最核心的就是 run()方法,不管何种方式其最终都是通过run()来运行。
CodingDiray
2019/09/25
4640
如何在 Linux 中创建非登录用户?
在 Linux 系统中,用户账户的管理是一个重要的任务。除了常规的登录用户,有时候我们需要创建一些非登录用户,这些用户通常用于运行服务、执行特定任务或限制访问权限。
网络技术联盟站
2023/05/26
2.6K0
如何在 Linux 中创建非登录用户?
如何在Visual Studio中调试.NET源码
In order to configure Visual Studio 2013 do the following in the Tools -> Options -> Debugging -> General menu:
卡尔曼和玻尔兹曼谁曼
2019/01/22
2K0
如何在Visual Studio中调试.NET源码
java:Observable/Observer模式在SWT环境下UI线程/非UI线程的透明化调用
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/53669793
10km
2019/05/25
5010
Java 非线程安全的HashMap如何在多线程中使用
Java 非线程安全的HashMap如何在多线程中使用 HashMap 是非线程安全的。在多线程条件下,容易导致死循环,具体表现为CPU使用率100%。因此多线程环境下保证 HashMap 的线程安全性,主要有如下几种方法: 使用 java.util.Hashtable 类,此类是线程安全的。 使用 java.util.concurrent.ConcurrentHashMap,此类是线程安全的。 使用 java.util.Collections.synchronizedMap() 方法包装 HashMap
nnngu
2018/03/15
1.9K0
Java 非线程安全的HashMap如何在多线程中使用
如何在SpringBoot应用中实现跨域访问资源和消息通信?
CORS ( Cross Origin Resource Sharing,跨域资源共享)机制允许Web应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。浏览器支持在API容器中(如XMLHttpRequest或Fetch )使用CORS,以降低跨域HTTP请求所带来的风险。
愿天堂没有BUG
2022/10/28
1.6K0
如何在SpringBoot应用中实现跨域访问资源和消息通信?
点击加载更多

相似问题

在UI线程中执行委托(使用消息泵)

52

UI线程同时运行消息泵和执行代码?

10

.NET窗口服务中的消息泵

36

Delphi -线程中的消息泵不接收WM_COPYDATA消息

26

如何在非WinForms程序集中泵出STA线程?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文