在运行其他方法时永远运行一个方法

时间:2019-12-12 20:43:39

标签: c# console-application

如何在运行代码时不断检查变量的值?

我想进行设置,以便无论它如何发生(减去,添加,设置值),只要“ myVar”等于0,就输出“ Dead”

static int myVar = 100;

public static void Main(){
  if(Console.ReadLine().Equals("kill")){
    myVar = 0;
  }
}

public static void Health(){
  while(true){
    if(myVar==0){
      Console.WriteLine("Dead");
    }
  }
}

3 个答案:

答案 0 :(得分:2)

  

一旦“ myVar”等于0,无论它是如何发生的(减去,添加,设置值),都会输出“ Dead”

最简单,最干净的方法是使myVar这样的属性:

private static int _myVar;
static int MyVar {
    get => _myVar;
    set {
        _myVar = value;
        if(value == 0) Console.WriteLine("Dead");
    }
}

public static void Main(){
    if(Console.ReadLine().Equals("kill")){
        MyVar = 0;
    }
}

通常,当存在事件驱动的解决方案时,轮询更新被认为是非常差的解决方案。在这种情况下,您有一个 setter 属性,该属性在属性值每次更改时执行一次:因此,当属性值更改为零时,下一行代码将立即输出“ Dead”需要等待某个线程轮询更改。

答案 1 :(得分:0)

这可能不是我的工作方式,但是如果没有更多信息,很难设计出简洁的东西。这是一个如何使用Task.Run()不断运行您的运行状况循环,同时还读取控制台行的示例。我还做了一个递归方法,以使程序从控制台读取后不会退出。

    static int myVar = 100;

    public static void Main()
    {
        Task.Run(() => Health());

        ListenForKill();
    }

    public static void Health()
    {
        while (true)
        {
            if (myVar == 0)
            {

                Console.WriteLine("Dead");
            }
        }
    }

    public static void ListenForKill()
    {
        if (Console.ReadLine().Equals("kill"))
        {
            myVar = 0;
        }

        //this way program won't exit
        ListenForKill();
    }

答案 2 :(得分:0)

如何在运行代码时不断检查变量的值?

完成此任务的好方法是实施发布/订阅解决方案。只要myvar的值发生变化,您的订户就会收到通知。这比其他解决方案更可取,因为它不需要并行编程,并且您可以隔离要如何处理订户中价值变动的逻辑。

class IntgerValueChangedPublisher
{
    public int MyVar { 
        get => _myVar; 
        set { 
            _myVar = value; 
            Publish(); 
        } 
    }

    private int _myVar = 0;
    private ICollection<IntegerValueChangedSubscriber> _subscribers = new LinkedList<IntegerValueChangedSubscriber>();

    public void Publish()
    {
        foreach(var subscriber in _subscribers)
        {
            subscriber.Receive(_myVar);
        }
    }

    public void Subscribe(IntegerValueChangedSubscriber subscriber)
    {
        _subscribers.Add(subscriber);
    }
}

class IntegerValueChangedSubscriber
{
    public void Receive(int value)
    {
        if (value.Equals(0))
        {
            Console.WriteLine("Dead");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        IntgerValueChangedPublisher valueChangedPublisher = new IntgerValueChangedPublisher();
        IntegerValueChangedSubscriber valueChangedSubscriber = new IntegerValueChangedSubscriber();
        valueChangedPublisher.Subscribe(valueChangedSubscriber);

        while (!Console.ReadLine().Equals("kill"))
        {
            // keep looping until "kill" is entered
        }

        valueChangedPublisher.MyVar = 0;
    }
}