C# “可怕的”;“回收链”;在winforms应用程序中

C# “可怕的”;“回收链”;在winforms应用程序中,c#,winforms,multithreading,delegates,callback,C#,Winforms,Multithreading,Delegates,Callback,我正在开发一个winforms应用程序,它非常复杂,到处都有大量的回调链 作为一个松散基于此代码的示例,可能有一个“Manager”类,该类生成一个“SetUpWorkerThreads”类,该类为10个工人创建一个“HandleWorker”线程。 工作线程有时需要回调manager类,要实现这一点,代码如下所示: public class Manager { public delegate void SomethingHappenedHandler(); private v

我正在开发一个winforms应用程序,它非常复杂,到处都有大量的回调链

作为一个松散基于此代码的示例,可能有一个“Manager”类,该类生成一个“SetUpWorkerThreads”类,该类为10个工人创建一个“HandleWorker”线程。 工作线程有时需要回调manager类,要实现这一点,代码如下所示:

public class Manager
{
    public delegate void SomethingHappenedHandler();

    private void Init()
    {
        var x = new SetUpWorkerThreads(SomethingHappened);
    }

    private void SomethingHappened()
    {
        // Handle something happened
    }

}

public class SetUpWorkerThreads
{
    private readonly Manager.SomethingHappenedHandler _somethingHappened;

    public SetUpWorkerThreads(Manager.SomethingHappenedHandler somethingHappened)
    {
        _somethingHappened = somethingHappened;
    }

    public void SetupTheThreads()
    {
        // Contrived!
        for (int x=0; x<10; x++)
        {
            var worker = new Worker(_somethingHappened);
            new Thread(worker.DoingSomething).Start();
        }
    }
}

public class Worker
{
    private readonly Manager.SomethingHappenedHandler _somethingHappened;

    public Worker(Manager.SomethingHappenedHandler somethingHappened)
    {
        _somethingHappened = somethingHappened;
    }

    public void DoingSomething()
    {
        // ... Do Something
        _somethingHappened();
    }
}
公共类管理器
{
public委托void something happendHandler();
私有void Init()
{
var x=新的SetUpWorkerThreads(发生了一些事情);
}
发生了什么事
{
//处理发生的事情
}
}
公共类SetUpWorkerThreads
{
private readonly Manager.something happendhandler\u something happed;
公共设置工作线程(Manager.somethinghappendhandler somethinghapped)
{
_somethingchapped=somethingchapped;
}
public void SetupTheThreads()
{
//做作!

对于(int x=0;x我看不出线程多少会造成问题。
一种选择是使用事件而不是回调,但这不会打破长链,也会给你一个取消订阅的地狱

一种可能的方法是创建一个负责处理所有事件的对象。可以作为一个单独的对象,也可以作为传递给所有线程(而不是回调)的单个对象。然后,您可以在EventRouter对象上有一个简单的接口,从线程引发事件。然后,您可以订阅EventRouter上的事件,您需要在其中处理“发生的事情”

编辑

GoF模式中的一些东西,但带有发布者-订阅者扭曲。

我喜欢用对象来处理事件的想法,这肯定会让这个应用程序中的事情变得更干净。。