C# 处理C中不需要的对象的最佳方法是什么?

C# 处理C中不需要的对象的最佳方法是什么?,c#,C#,我有一个C语言的类,它启动了很多复杂的操作 为了可读性,每个操作都封装在自己的类中,主类执行如下操作: var A = new StartProcessX(); var B = new StartProcessY(); 等等。。。 这些对象中的每一个都是通过回调等方式启动系统的,因此它们只需要初始化,并且在某种程度上是自给自足的 另一种方法是把它全部放在一个局部类中,但很快就会变得一团糟 有没有一种很好的方法来构造它以提高可读性?在构造函数中开始后台工作是非常糟糕的设计。也就是说,没有任何东西

我有一个C语言的类,它启动了很多复杂的操作

为了可读性,每个操作都封装在自己的类中,主类执行如下操作:

var A = new StartProcessX();
var B = new StartProcessY();
等等。。。 这些对象中的每一个都是通过回调等方式启动系统的,因此它们只需要初始化,并且在某种程度上是自给自足的

另一种方法是把它全部放在一个局部类中,但很快就会变得一团糟


有没有一种很好的方法来构造它以提高可读性?

在构造函数中开始后台工作是非常糟糕的设计。也就是说,没有任何东西可以阻止您只调用new而不捕获返回的对象

new StartProcessX();
new StartProcessY();
vs

更好的方法是创建对象并保留对它们的引用,以便取消任务或知道任务何时完成

class Program {
    private static StartProcessX _startProcessX;
    private static StartProcessY _startProcessY;

    public static Main {
        _startProcessX = new StartProcessX;
        _startProcessY = new StartProcessY;

        _startProcessX.Start();
        _startProcessY.Start();

        // do something
        while ( running ) {

        } 
        Exit();
    }

    public static void Exit () {
        _startProcessX.Cancel();
        _startProcessY.Cancel();
    } 
}
根据下面的评论进行编辑

如果这太冗长,那么考虑注册它们。也许这更适合你的情况

abstract class Process {
    abstract void Start();
    abstract void Stop();
}
class Program {
    private static Dictionary<Type, Process> Processes;

    public static Main {

        // Initialize all 40 objects
        Processes = new Dictionary <Type, Process> () {
            { typeof(ProcessX), new ProcessX },
            { typeof(ProcessY), new ProcessY }
        };

        // Start them all. This could be moved to a function.
        foreach ( var process in Processes ) {
            process.Start();
        }
        while ( running ) {

        } 

        // Stop or cancel a specific process by type.
        Stop<ProcessX>();

        // or stop all processes
        foreach( var process in Processes ) {
            process.Stop();
        }
    }

    public static void Stop<T> () {
        if ( Processes.TryGetValue ( typeof(T), out Process process) ) {
            process.Stop();
        }
    }
}

我建议创建一个一次性服务经理:

class ServiceManager : IDisposable
{

    private IDisposable _startServices()
    {
        var d = new CompositeDisposable();

        new StartProcessX().DisposeWith(d); // those clasess should implement IDisposable and stop the work when disposed
        new StartProcessY().DisposeWith(d);
        new StartProcessZ().DisposeWith(d);

        return d;
    }

    public void StartServices()
    {
       _services = _startServices(); 
      // do some logging or whatever
    }


    public void StopServices()
    {
       _services?.Dispose(); 
    }

    public void Dispose()
    {
      StopServices();
    }
}
这样,即使有很多服务,它也非常可读,并且在停止服务时很容易管理

var A = new StartProcessX();
var B = new StartProcessY();
对此要非常小心,我有一段代码,它创建了一个计时器,时间间隔为几秒钟,以延迟读取结果。在重载情况下,垃圾收集器实际上收集了我的计时器并调用了Dispose,我看到的只是一些网络包没有被处理。花了一点时间调试来找出哪里出了问题


即使您实际上不需要这些对象,也可以将它们根放到您的主类(可能是您的主窗体),以便它们共享其生命周期

你是说构造器本身开始了后台工作?多么糟糕的设计啊。构造函数用于创建对象,而不是启动后台操作。我不太清楚你在问什么。您是否不需要将这些对象存储在变量中?以后不必使用这些变量,甚至不必声明它们。也许这些根本不应该是对象,而只是静态方法?我不太清楚设计想要完成什么或问题是什么。@Thomas这有很大的不同,它显示了启动/运行某些东西的意图使用抽象的启动方法导入基类,继承,保留列表。或者直接使用Task,因为看起来它们就是这样的。但我不需要它们!哦,你会的,即使只是为了以后调试。跑到远处去做空间事情的对象,除了它们碰巧产生的线程之外,任何人都无法接触到,这真的不是一个好主意。@Jeroenmoster:事实上,这可以让整个事情看起来更干净。该系统捕获了大量的金融报价,因此它有大量的函数,只需侦听消息、解析消息、执行回调等;我想让它看起来更干净;这与卡米洛上面所说的很相似,我认为这会提高可读性。这就是它的起源,但现在有40多个这样的对象,它变得比新的ProcessX、新的ProcessY等更不清晰。嘿,我更新了我的答案,以便更好地适应您的情况。好的,这非常重要;谢谢你让我知道!
var A = new StartProcessX();
var B = new StartProcessY();