是否有任何简单的开箱即用的基础结构来在主管理器线程中执行操作(事件)
本文关键字:线程 管理器 操作 事件 执行 结构 简单 任何 是否 | 更新日期: 2023-09-27 18:06:37
我想实现一个启动多个工作线程的主(管理器)线程。工作线程生成事件,并回调到所提供的事件处理程序。我想在主线程(序列化)中执行事件处理程序。(就像Control一样。调用在创建控件的线程中执行操作)
我知道这涉及到主管理器线程中的消息循环,以及序列化回调的消息队列,请不要详细解释这一点。
我不想重新发明轮子,从头开始实现这个。在。net中有没有现成的实现,或者有轻量级的开源实现?(类似于并发模式实现或类似)
请注意:没有GUI,只有N+1个线程。
Thanks in advance
作为任务并行库中可能构造的替代方法,您可以通过AutoResetEvent实现这一点。这是一个非常粗略的想法,但你应该能够完善它。主线程在启动工作线程后,将等待AutoResetEvent
。当一个工作线程想要主线程做某事时,它可以设置AutoResetEvent
实例,主线程就会继续。
下面是一个简单的例子:
(类级)
const int MaxThreads = 5;
AutoResetEvent[] _waitHandles = new AutoResetEvent[MaxThreads]; // one for each thread
ActionEnum[] _callbackActions = new ActionEnum[MaxThreads]; // one for each thread
object _callbackActionsLock = new object();
(主线程)for (int i = 0; i < MaxThreads; i++)
{
_waitHandles[i] = new AutoResetEvent(false);
}
// start 5 worker threads passing each thread its zero-based index...
// Wait loop:
for (int i = 0; i < MaxThreads; i++)
{
bool result = _waitHandles[i].WaitOne(500);
if (result)
{
PerformAction(i);
}
}
private void PerformAction(int i)
{
switch (_actions[i])
{
case Actions.CallbackA: ...
break;
case Actions.CallbackB: ...
break;
...
}
}
工作线程可以像这样设置和等待句柄
(工作线程)// ... do some work
lock(_callbackActionsLock) // if no other thread will use this index of _callbackActions then no need for this lock
{
_callbackActions[currThreadIndex] = Actions.CallbackB;
}
_waitHandles[i].Set();
...