【问题标题】:Horrible "Callback chains" in winforms applicationwinforms 应用程序中可怕的“回调链”
【发布时间】:2011-09-29 07:43:50
【问题描述】:

我正在开发一个非常复杂的 winforms 应用程序,并且有大量的回调链在各处传递。

作为一个基于此代码的松散示例,可能有一个“Manager”类,它产生一个“SetUpWorkerThreads”类,它为 10 个工人创建一个“HandleWorker”线程。 工作线程有时需要回调管理器类,代码如下:

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();
    }
}

实际上,可能涉及更多类,每个类都为各种事情传递大量回调。我意识到糟糕的类/应用程序设计在其中发挥了作用,但是有没有更好的方法来处理类之间的这些交互,特别是在 winforms 应用程序中,以及在进行大量线程处理时?

【问题讨论】:

    标签: c# winforms multithreading delegates callback


    【解决方案1】:

    我看不出线程或多或少会造成问题。
    一种选择是使用事件而不是回调,但这不会破坏长链,也会给你一个取消订阅的地狱。

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

    编辑
    类似于 GoF 模式 Mediator,但带有发布者-订阅者的扭曲。

    【讨论】:

    • 我喜欢一个对象来处理事件的想法,肯定会在这个应用程序中清理很多东西..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多