C# 从另一个没有GUI的类调用Windows窗体应用程序中的计时器勾号事件

C# 从另一个没有GUI的类调用Windows窗体应用程序中的计时器勾号事件,c#,windows,timer,C#,Windows,Timer,我正在尝试运行timer tick事件,该事件最初在我的windows窗体上运行,也在使用线程加载到另一个类时运行。我尝试在另一个线程上调用计时器事件,但没有任何帮助。我应该使用相同的计时器还是为该线程创建新的计时器。这是我当前的实现: namespace XT_3_Sample_Application { public partial class Form1 : Form { Queue<string> receivedDataList =

我正在尝试运行timer tick事件,该事件最初在我的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(); 
    }



   }
}
namespace XT\u 3\u示例\u应用程序
{
公共部分类Form1:Form
{
Queue receivedDataList=新队列();
System.Timers.Timer tmrtcpolling=new System.Timers.Timer();
公共表格1()
{
初始化组件();
TM702_G2_连接_初始化();
}
静态void threadcal()
{
Class1 c=新的Class1();
c、 计时器启动();
c、 试验(“192.168.1.188”,9999);
}
公共字符串连接(字符串TCP\U IP\U地址、int TCP\U端口号)
{
if(TCP客户端已连接)
{
Socket\u Client=tcpClient.Client;
TcpStreamReader_Client=newstreamreader(tcpClient.GetStream(),Encoding.ASCII);
tmrtcpolling.Start();
Status=“已连接\r\n”;
}
其他的
{
Status=“无法连接\r\n”;
}
}
公共字符串连接\断开连接()
{
tmrtcpolling.Stop();
//做点什么
返回“已断开连接\r\n”;
}
无效TM702\u G2\u连接\u初始化()
{
tmrtcpolling.Interval=1;
tmrtcpolling.appeased+=新的ElapsedEventHandler(tmrtcpolling\u appeased);
} 
#区域计时器事件
void tmrtcpolling_已过(对象发送方,ElapsedEventArgs e)
{
尝试
{
如果(tcpClient.Available>0)
{
receivedDataList.Enqueue(TcpStreamReader_Client.ReadLine());
}
}
捕获(例外)
{
//投掷;
}
}
私有void tmrDisplay_勾选(对象发送方,事件参数e)
{
勾选();
}
公共空白勾号()
{
Console.Write(“勾选”+Environment.NewLine);
如果(receivedDataList.Count>0)
{
字符串RAW_Str=receivedDataList.Dequeue();
//tbxConsoleOutput.AppendText(RAW_Str+Environment.NewLine);
tbxConsoleOutput.AppendText(解析器选择(RAW\u Str)+Environment.NewLine);
}
}
#端区
私有void btnConnect_单击(对象发送者,事件参数e)
{
tbxConsoleOutput.AppendText(Connection_Connect(tbxTCPIP.Text,Convert.ToInt32(tbxPort.Text,10));
螺纹t=新螺纹(螺纹校准);
t、 Start();
}
}
}
但计时器滴答声事件在应用程序启动时启动,而不是在按钮单击-私有void btnconconnect_单击(对象发送方,事件参数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();
    }
   }
}
namespace XT\u 3\u示例\u应用程序
{
一班
{
TCP客户机TCP客户机;
Socket_客户端;
StreamReader TcpStreamReader_Client;//以ASCII格式读取
Queue receivedDataList=新队列();
System.Timers.Timer tmrtcpolling=new System.Timers.Timer();
无效TM702\u G2\u连接\u初始化()
{
tmrtcpolling.Interval=1;
tmrtcpolling.appeased+=新的ElapsedEventHandler(tmrtcpolling\u appeased);
} 
公共无效测试(字符串TCP\U IP\U地址、int TCP\U端口号)
{
TM702_G2_连接_初始化();
尝试
{
字符串状态=”;
Ping pingSender=新Ping();
PingOptions=新的PingOptions();
PingReply reply=pingSender.Send(TCP\U IP\U地址、超时、缓冲区、选项);
if(reply.Status==IPStatus.Success)
{
tcpClient=新的tcpClient();
tcpClient.Connect(TCP\U IP\U地址、TCP\U端口号);
if(TCP客户端已连接)
{
Socket\u Client=tcpClient.Client;
TcpStreamReader_Client=newstreamreader(tcpClient.GetStream(),Encoding.ASCII);
tmrtcpolling.Start();
Status=“已连接\r\n”;
}
其他的
{
Status=“无法连接\r\n”;
}
}
其他的
{
Status=“Ping失败\r\n”;
}
MessageBox.Show(TCP_IP_地址+”:“+状态);
}
catch(System.Exception-ex)
{
MessageBox.Show(TCP_IP_地址+”:“+ex.Message);
}
setFilterType();
setButtonRadioVL();
heloCmd();
}
公共无效计时器_Start()
{
Form1 f=新的Form1();
f、 勾选();
}
}
}

尝试上述方法时,计时器不会在新线程上启动。有什么建议吗

如果没有任何阻塞代码或循环,您的线程将不会长久。下面每秒钟调用一次测试方法,不使用计时器

    static void threadcal()
    {
        while (true)
        {
            Thread.Sleep(1000);
            Class1 c = new Class1();
            c.test("192.168.1.188", 9999);
        }
    }

除非将threadcall()的内容包装在某种类型的循环中,否则线程将在执行threadcall()后终止。你必须使用定时器吗?是的,定时器应该能够读取服务器的回复。私有void tmrDisplay_Tick(objectsender,EventArgs e)方法有助于实现这一点。我应该使用Form1类的实例还是创建一个新实例?另一个想法是:看起来只有当计时器启动时,您才在处理数据——要么是通过它自己的计时器,要么是通过按下按钮来工作。您可以改为在侦听器中接收数据,并在接收到数据时引发事件。如果你想知道更多关于这个的信息,我会把它作为w的答案