C# “可怕的”;“回收链”;在winforms应用程序中
我正在开发一个winforms应用程序,它非常复杂,到处都有大量的回调链 作为一个松散基于此代码的示例,可能有一个“Manager”类,该类生成一个“SetUpWorkerThreads”类,该类为10个工人创建一个“HandleWorker”线程。 工作线程有时需要回调manager类,要实现这一点,代码如下所示: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
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模式中的一些东西,但带有发布者-订阅者扭曲。我喜欢用对象来处理事件的想法,这肯定会让这个应用程序中的事情变得更干净。。