需要使用计时器在另一个 class 中调用一个方法,一旦完成 return 控制主要部分 class(用户控制)

Need to call a method in another class with timer and once done to return control to the main partial class (user control)

请检查以下代码,它是对我所拥有的代码的过度简化。 我需要知道一旦计时器结束,如何 return 控制主用户控件 class,最好是在 switch 语句中的相同情况。

public partial class ucClass : UserControl
{
    int A;
    Label labelTimer = new Label();
    
    sec secObj = new sec();
    
    public execute()
    {
        switch(A)
        {
        case 1:
            secObj.initiate(labelTimer, 10);
            break:
        case 2:
        ......
        }
    }
    
}
class sec
{
    public System.Windows.Forms.Timer timer;
    
    private Label labelTimer = new Label();
    private int expectedCount = 0;
    private int actualCount = 0;
    
    public void initiate(Label labelTimer, int count)
    {
        this.expectedCount = count;
        this.labelTimer = labelTimer;
        this.timer.Interval = 1000;
        startTimer();
    }
    
    private void startTimer()
    {
        this.timer.Start();
        this.timer.Tick += this.timerElapsed;
    }
    
    private void timerElapsed(object sender, EventArgs e)
    {
        this.timer.Dispose();
        if(expectedCount > actualCount)
        {
            this.actualCount += 1;
            this.labelTimer.Text = this.actualCount.ToString();
            this.startTimer();
        }
        else
        {
            //this is where I need to notify the main class that timer has expired and go to case 2
        }
    }
}

您可以通过事件实现您想要的行为:

public partial class ucClass : UserControl
{
    int A;
    Label labelTimer = new Label();
    
    sec secObj = new sec();

    public ucClass()
    {
        // Listen to event from timer
        secObj.TimerExpired += (sender, args) =>
        {
             A = args.Count;
             execute();
        };
    }

    public void execute()
    {
        switch(A)
        {
            case 1:
                secObj.initiate(labelTimer, 10);
                break:
            case 2:
                ......
        }
    }
    
}

class sec
{
    public System.Windows.Forms.Timer timer;

    public event EventHandler<TimerExpiredEventArgs> TimerExpired;
    
    private Label labelTimer = new Label();
    private int expectedCount = 0;
    private int actualCount = 0;
    
    public void initiate(Label labelTimer, int count)
    {
        this.expectedCount = count;
        this.labelTimer = labelTimer;
        this.timer.Interval = 1000;
        startTimer();
    }
    
    private void startTimer()
    {
        this.timer.Start();
        this.timer.Tick += this.timerElapsed;
    }
    
    private void timerElapsed(object sender, EventArgs e)
    {
        this.timer.Dispose();
        if(expectedCount > actualCount)
        {
            this.actualCount += 1;
            this.labelTimer.Text = this.actualCount.ToString();
            this.startTimer();
        }
        else
        {
            // Send event with count
            TimerExpired?.Invoke(this, new TimerExpiredEventArgs
            {
                Count = actualCount
            });

        }
    }
}

public class TimerExpiredEventArgs
{
    public int Count { get; set; }
}

我建议您查看以下内容;

  • MVVM 模式
    • 这将允许您分离 UI 逻辑(传递标签等)和控制逻辑(定时器等)。
  • 响应式扩展(https://github.com/dotnet/reactive
    • 这将允许一个非常简单的计时器:
      Observable
         .Interval(TimeSpan.FromSeconds(1))
         .Subscribe(count => {
            labelTimer.Text = count.ToString();
            if (count > actualCount) {
              A = args.Count;
              execute();
            }
         });