C# 在主管理器线程中是否有任何简单的开箱即用基础结构来执行操作(事件)?
我想实现一个主(管理器)线程,它启动多个工作线程。工作线程生成事件,并回调提供的事件处理程序。我希望在主线程中执行事件处理程序(序列化)。(就像Control.Invoke在创建控件的线程中执行操作一样) 我知道这涉及到主管理器线程中的一个消息循环,以及一个消息队列,其中回调被序列化,请不要详细解释这一点 我不想重新发明轮子,从零开始实现它。是否有任何现成的.NET或任何轻开源实现?(如并发模式实现或类似) 请注意:没有GUI,只有N+1个线程C# 在主管理器线程中是否有任何简单的开箱即用基础结构来执行操作(事件)?,c#,.net,multithreading,design-patterns,concurrency,C#,.net,Multithreading,Design Patterns,Concurrency,我想实现一个主(管理器)线程,它启动多个工作线程。工作线程生成事件,并回调提供的事件处理程序。我希望在主线程中执行事件处理程序(序列化)。(就像Control.Invoke在创建控件的线程中执行操作一样) 我知道这涉及到主管理器线程中的一个消息循环,以及一个消息队列,其中回调被序列化,请不要详细解释这一点 我不想重新发明轮子,从零开始实现它。是否有任何现成的.NET或任何轻开源实现?(如并发模式实现或类似) 请注意:没有GUI,只有N+1个线程 提前感谢作为任务并行库中可能构造的替代,您可以通过
提前感谢作为任务并行库中可能构造的替代,您可以通过。这是一个非常粗略的想法,但您应该能够改进它。主线程在启动辅助线程后将等待
AutoResetEvent
。当工作线程希望主线程执行某些操作时,它可以设置AutoResetEvent
实例,主线程将继续
下面是一个简单的例子
(班级层面)
(主线程)
你可能想看看TPL:@quantdev:我看了,我想我知道TPL,也许我错过了什么。您能指出在这个相当大的页面中,将方法调用封送到另一个线程的确切方式是什么吗?
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();
...