C# 中使用 Action<bool> 委托的构造函数注入

Constructor Injection with Action<bool> delegate in C#

问题是我需要在某些句柄 class 和某些控制台应用程序之间注入依赖项(构造函数依赖项)。 控制台应用程序有状态 isRunning,这显然是 bool 变量。我可以从控制台应用程序调用 exit 命令,然后出现问题。由于 bool 是值类型,当我们将它作为构造函数参数传递给某些 class,然后更改它在 class 中的值时,控制台应用程序的状态不会不改变。所以我需要注入依赖。 我有这样的代码。

private static class Program
{
    private static bool isRunning = true;

    private static void Main(string[] args)
    {
        ...
        var exitHandler = new ExitHandler(isRunning);
        do
        {
            exitHandler.Exit();
        }
        while (isRunning);
    }
}
... 
public class ExitHandler
{
   ...
   private readonly Action<bool> applicationState;
   ...
   public void Exit();

}

我知道我们可以将 bool 值包装到 class 中,而不是将其作为参数传递,但不知何故,它可以通过 Action 委托来完成。 问题是怎么做?

一个动作可以“捕获”一个局部变量或字段。所以这很简单:

internal class Program
{
    static bool isRunning = true;
    static void Main(string[] args)
    {
        var exitHandler = new ExitHandler(() => isRunning = false) ;
        do
        {
            exitHandler.Exit();
        }
        while (isRunning);
    }
}
public class ExitHandler
{
    Action onExit;
    public ExitHandler(Action onExit)
    {
        this.onExit = onExit;
    }
   public void Exit() => onExit();

}

在我看来,您可以使用 CancellationTokenSource

internal class Program
{
    static void Main(string[] args)
    {
        var exitHandler = new CancellationTokenSource();
        do
        {
            exitHandler.Cancel();
        }
        while (!exitHandler.IsCancellationRequested);
    }
}

它更简单,而且线程安全。