0

我正在尝试运行最初在我的 Windows 窗体上运行的计时器滴答事件,当使用线程加载到另一个类时也是如此。我尝试在另一个线程上调用计时器事件,但没有帮助。我应该使用相同的计时器还是为该线程创建一个新的计时器。这是我目前的实现:

namespace XT_3_Sample_Application
{
      public partial class Form1 : Form
      {

       Queue<string> receivedDataList = new Queue<string>();



       System.Timers.Timer tmrTcpPolling = new System.Timers.Timer(); 

       public Form1()
       {
        InitializeComponent();
        TM702_G2_Connection_Initialization();

         }

         static void threadcal()
         {
        Class1 c = new Class1();
        c.timer_start();
        c.test("192.168.1.188",9999);

        }


       public string Connection_Connect(string TCP_IP_Address, int TCP_Port_Number)
          {

                if (tcpClient.Connected)
                {
                    Socket_Client = tcpClient.Client;
                    TcpStreamReader_Client = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
                    tmrTcpPolling.Start();
                    Status = "Connected\r\n";
                }
                else
                {
                    Status = "Cannot Connect\r\n";
                }



        }

       public string Connection_Disconnect()
       {
           tmrTcpPolling.Stop();

          // do something

          return "Disconnected\r\n";
      }

     void TM702_G2_Connection_Initialization()
    {
        tmrTcpPolling.Interval = 1;
        tmrTcpPolling.Elapsed += new ElapsedEventHandler(tmrTcpPolling_Elapsed);
    } 


    #region Timer Event
    void tmrTcpPolling_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            if (tcpClient.Available > 0)
            {

                receivedDataList.Enqueue(TcpStreamReader_Client.ReadLine());
            }
        }
        catch (Exception)
        {

            //throw;
        }
    }

    private void tmrDisplay_Tick(object sender, EventArgs e)
    {
        Tick();
    }

    public void Tick()
    {
        Console.Write("tick" + Environment.NewLine);
        if (receivedDataList.Count > 0)
        {
            string RAW_Str = receivedDataList.Dequeue();
            //tbxConsoleOutput.AppendText(RAW_Str + Environment.NewLine);
            tbxConsoleOutput.AppendText(Parser_Selection(RAW_Str) + Environment.NewLine);
        }

    }

    #endregion

    private void btnConnect_Click(object sender, EventArgs e)
    {
        tbxConsoleOutput.AppendText(Connection_Connect(tbxTCPIP.Text, Convert.ToInt32(tbxPort.Text, 10)));
        Thread t = new Thread(threadcal);
        t.Start(); 
    }



   }
}

但是计时器滴答事件在应用程序启动但不是在按钮单击时开始 - private void btnConnect_Click(object sender, EventArgs e)。我正在尝试为 Class1 类的测试方法调用一个单独的线程。对于这个线程,我正在尝试使用类似的计时器事件来接收来自服务器的输出。

 namespace XT_3_Sample_Application
 {
   class Class1
   {

    TcpClient tcpClient;
    Socket Socket_Client;
    StreamReader TcpStreamReader_Client;    // Read in ASCII
    Queue<string> receivedDataList = new Queue<string>();
    System.Timers.Timer tmrTcpPolling = new System.Timers.Timer();



    void TM702_G2_Connection_Initialization()
    {
        tmrTcpPolling.Interval = 1;
        tmrTcpPolling.Elapsed += new ElapsedEventHandler(tmrTcpPolling_Elapsed);
    } 
    public void test(string TCP_IP_Address, int TCP_Port_Number)
    {
        TM702_G2_Connection_Initialization();


        try
        {
            string Status = "";
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();




            PingReply reply = pingSender.Send(TCP_IP_Address, timeout, buffer, options);

            if (reply.Status == IPStatus.Success)
            {
                tcpClient = new TcpClient();
                tcpClient.Connect(TCP_IP_Address, TCP_Port_Number);

                if (tcpClient.Connected)
                {
                    Socket_Client = tcpClient.Client;
                    TcpStreamReader_Client = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
                    tmrTcpPolling.Start();
                    Status = "Connected\r\n";
                }
                else
                {
                    Status = "Cannot Connect\r\n";
                }
            }
            else
            {
                Status = "Ping Fail\r\n";
            }

            MessageBox.Show(TCP_IP_Address + " :" + Status);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(TCP_IP_Address + " :" +  ex.Message);
        }


        setFilterType();

        setButtonRadioLvl();
        heloCmd();



    }
    public void timer_Start()
    {
    Form1 f = new Form1();
    f.Tick();
    }
   }
}

尝试上述方法时,不会在新线程上触发计时器。对此有何建议?

4

1 回答 1

0

如果没有任何阻塞代码或循环,您的线程将不会存活很长时间。以下每隔一秒调用一次您的测试方法并且不使用计时器

    static void threadcal()
    {
        while (true)
        {
            Thread.Sleep(1000);
            Class1 c = new Class1();
            c.test("192.168.1.188", 9999);
        }
    }
于 2012-11-21T04:20:45.230 回答