【问题标题】:Timer won't start when I raise timer.Start() event当我引发 timer.Start() 事件时,计时器不会启动
【发布时间】:2016-07-01 12:07:14
【问题描述】:

这是代码块。我将在下面解释细节。

public static bool isConnected;
    public MasterClient()    //Master Constructor
    {
         timer1.Interval = 1000;
         isConnected = false;
    }

    private void connectCallback(IAsyncResult ar)
    {
        try
        {

            _ClientSocket.EndConnect(ar);

            //Global.Meuser = Environment.MachineName;
            BeginReceive();
            Invoke((MethodInvoker)delegate
            {
                tslStatus.Text = "Connected";
                btnConnect.Text = "Disconnect";

                tslStatus.Image = Image.FromFile(Global.path + @"\image\status\online.png");
                lbllocalIP.Text = _ClientSocket.LocalEndPoint.ToString();
                isConnected = true;
                //this.WindowState = FormWindowState.Minimized;

            });

        }
        catch (SocketException ex)
        {
            isConnected = false;
        }
        finally
        {
            if (isConnected == false)
            {
                counter = 0;
                timer1.Start();
            }
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        isConnected = false;
        counter += 1;
        if (counter > 45)
        {
            counter = 0;
            timer1.Stop();
            AutoStart();
        }
    }

    public void AutoStart()
    {
        if (btnConnect.Text == "Connect")
        {
            if (IsRunning == false)
            {
                _buffer = new byte[8192];
                _ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _ClientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse(txtServerIP.Text), 9192), new AsyncCallback(connectCallback), null);
            }

        }
        else if (btnConnect.Text == "Disconnect")
        {
            if (IsRunning == true)
            {
                CloseClient();

                btnConnect.Text = "Connect";
                lbllocalIP.Text = "None";
                tslStatus.Text = "Disconnected";
                tslStatus.Image = Image.FromFile(Global.path + @"\image\status\offline.png");

            }

        }
    }

计时器应该在connectCallback 方法的finally 块中引发的timer1.Start() 事件之后启动。

当我使用断点检查时,在调用timer1.Start() 后,它将变为 Enabled=true 状态。

我已从工具箱中取出计时器控件并将其间隔设置为 1000。

但timer1.Tick 事件仍然没有引发。

条件:当服务器当时没有运行时,SocketException 会触发,同时我需要启动计时器,所以它会在 45 秒后尝试再次连接到服务器,如果失败将重新排队。

【问题讨论】:

    标签: c# winforms timer


    【解决方案1】:

    在调用timer1.start() 之前,您需要附加事件处理程序。我认为您的代码中缺少它-

    timer1.Tick += new EventHandler(timer1_Tick);
    

    我建议在你的构造函数中这样做。

    另外,当isConnected == false 时,您正在调用timer1.start()。我认为您需要将 timer1.start() 移到 if 条件之外。

    看看这是否有帮助。

    【讨论】:

    • 我已经从工具箱中获得了控制权,并且我已经在设计器页面中拥有了该行。 this.timer1.Interval = 1000;this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
    • 当 isConnected == false 时,您正在调用 timer1.start()。我认为您需要将 timer1.start() 移到 if 条件之外。
    • 我需要在 try 块中触发异常时调用它。它会去捕获块并设置isConected=true 我试图通过确保输入错误的IP地址来做到这一点,所以它会抛出SocketException。
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多