2016-07-01 3 views
0

これはコードブロックです。私は以下の詳細を説明します。timer.Start()イベントを発生させるとタイマが起動しません

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秒後に試行し、失敗した場合は再キューされます。

答えて

0

timer1.start()に電話する前に、イベントハンドラを接続する必要があります。私はそれがあなたのコードにないと思う -

timer1.Tick += new EventHandler(timer1_Tick); 

私はあなたのコンストラクタでこれを行うことをお勧めします。

isConnected == falseの場合はtimer1.start()となります。私はtimer1.start()をif条件の外に移動する必要があると思います。

これが役立つかどうかを確認してください。

+0

私はツールボックスからコントロールを取得しており、デザイナーページには既にその行があります。 'this.timer1.Interval = 1000;' 'this.timer1.Tick + = new System.EventHandler(this.timer1_Tick);' –

+0

isConnected == falseのときにtimer1.start()を呼び出しています。私はif条件の外にtimer1.start()を移動する必要があると思います。 – Sanket

+0

tryブロックで例外が発生したときに呼び出す必要があります。ブロックをキャッチして 'isConected = true'を設定します。 これは、間違ったIPアドレスを入力してSocketExceptionをスローするようにしています。 –

関連する問題