Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在主管理器线程中是否有任何简单的开箱即用基础结构来执行操作(事件)?_C#_.net_Multithreading_Design Patterns_Concurrency - Fatal编程技术网

C# 在主管理器线程中是否有任何简单的开箱即用基础结构来执行操作(事件)?

C# 在主管理器线程中是否有任何简单的开箱即用基础结构来执行操作(事件)?,c#,.net,multithreading,design-patterns,concurrency,C#,.net,Multithreading,Design Patterns,Concurrency,我想实现一个主(管理器)线程,它启动多个工作线程。工作线程生成事件,并回调提供的事件处理程序。我希望在主线程中执行事件处理程序(序列化)。(就像Control.Invoke在创建控件的线程中执行操作一样) 我知道这涉及到主管理器线程中的一个消息循环,以及一个消息队列,其中回调被序列化,请不要详细解释这一点 我不想重新发明轮子,从零开始实现它。是否有任何现成的.NET或任何轻开源实现?(如并发模式实现或类似) 请注意:没有GUI,只有N+1个线程 提前感谢作为任务并行库中可能构造的替代,您可以通过

我想实现一个主(管理器)线程,它启动多个工作线程。工作线程生成事件,并回调提供的事件处理程序。我希望在主线程中执行事件处理程序(序列化)。(就像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();
...