我正在读这个博客:正确使用线程,我想知道:
如何在非UI线程中实现消息(注释:我不是指Windows这里的)?
我想要的是消息可以是一个对象或命令,比如Action<T>
/Func<T>
,等等。对于不同类型的消息,我必须使用不同的队列吗?假设对象有一个队列,Action<T>
/Func<T>
有一个队列
考虑到消息的类型不同,如何实现它?
编辑:
我想要完成的是一个生产者/消费者模型,生产者/消费者共享队列进行通信,队列不仅可以包含对象供消费者使用,还可以将一些‘命令’传递给使用者执行。
发布于 2010-04-10 13:17:14
使这成为代码格式化的单独答案。
好的,在阅读您的更新之后,我想您想要的是我在“第二种情况”中所描述的--您只是想要
Broadcast<T>("Foo")
其中T是代表。
那么你的消费者就会
Subscribe<T>("Foo",HandlerMethod)
因此,生产者消费者场景将如下所示
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
}
}
这只是我头上的一些东西,是一个精心设计的例子,所以,用一点盐来看吧。这几乎正是我正在做的快递框架,我早些时候发布的。您可能需要深入研究该代码,以获得一个更具体的实现示例。
您需要考虑如何管理使用者,如何验证广播和订阅,以及如何确保正确地调用正在传递的委托?还是你在乎?
这个有用吗?
发布于 2010-04-10 09:55:50
术语“消息泵”专门指Windows中的GUI线程(即使它们实际上没有创建GUI)。
听起来可能您是在讨论消息,但是即使消息队列也不会接受操作或函数,它会接受特定类型的消息。
我肯定从未听说过将Func<T>
传递给消息队列--结果将如何处理?你要把它藏在什么地方吗?给打电话的人发个信息?对我来说似乎没什么用。
不管你想要做什么,听起来都是由内置的.NET线程池来处理的。这实际上是为异步执行代码而设计的,而不是排队和处理消息。
发布于 2010-04-10 09:18:08
在启动线程之前,需要Thread.SetApartmentState()将线程切换到STA,然后在线程函数中调用Application.Run()来启动消息循环。
不过,这与Action代表没有任何关系。消息队列是存储鼠标和键盘消息的内部Windows结构。存储自己的物品是不合适的。不知道你想把这个带到哪里去。
常规System.Collections.Generic.Queue<>对象可以存储任何类型的对象,包括表示“命令”的类的对象。使用ReaderWriterLockSlim使其线程安全。
https://stackoverflow.com/questions/2613932
复制