簡體   English   中英

C#重新啟動TCP服務器

[英]c# restart a tcp server

我有以下c#表單應用程序,它是一個處理傳入文件請求的tcp服務器。 我想在進行一些異常處理或通過手動按下按鈕時重新啟動線程。 問題是,一旦我調用線程Abort()函數,整個應用程序就會凍結。

我確實了解,還有其他一些方法可以更優雅地執行此操作。 那我該怎么辦? 謝謝!

  public partial class Form1 : Form
{
    Thread t2;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
         t2 = new Thread(delegate()
        {
            startServer();
        });
        t2.Start();

    }

    private void restartServer()
    {
        t2.Abort();
        t2.Start();
    }

    private void startServer()
    {

            // Listen on port 1234      
        TcpListener tcpListener = new TcpListener(IPAddress.Any, 1234);

            tcpListener.Start();

            Console.WriteLine("Server started");
            textBox1.Invoke((MethodInvoker)(() => textBox1.Text += "server started"));
            //Infinite loop to connect to new clients      
            while (true)
            {
                // Accept a TcpClient      
                TcpClient tcpClient = tcpListener.AcceptTcpClient();

                //textBox1.Text += "Connected to client\n";
                textBox1.Invoke((MethodInvoker)(() => textBox1.Text += "Connected to client"));
                StreamReader reader = new StreamReader(tcpClient.GetStream());

                // The first message from the client is the file size      
                string cmdFileSize = reader.ReadLine();

                // The first message from the client is the filename      
                string cmdFileName = reader.ReadLine();

                int length = Convert.ToInt32(cmdFileSize);
                byte[] buffer = new byte[length];
                int received = 0;
                int read = 0;
                int size = 1024;
                int remaining = 0;

                // Read bytes from the client using the length sent from the client      
                while (received < length)
                {
                    remaining = length - received;
                    if (remaining < size)
                    {
                        size = remaining;
                    }

                    read = tcpClient.GetStream().Read(buffer, received, size);
                    received += read;
                }

                // Save the file using the filename sent by the client      
                String fileName = Path.GetFileName(cmdFileName);
                String path1 = Path.GetDirectoryName(Application.ExecutablePath) + "\\ReceivedLogs\\" + fileName;
                Console.WriteLine("path:"+path1);
                using (FileStream fStream = new FileStream(path1, FileMode.Create))
                {
                    fStream.Write(buffer, 0, buffer.Length);
                    fStream.Flush();
                    fStream.Close();
                }
                textBox1.Invoke((MethodInvoker)(() => textBox1.Text += "File received and saved in " + Environment.CurrentDirectory + "\n"));
               // textBox1.Text += ("File received and saved in " + Environment.CurrentDirectory+"\n");
            }
        }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        restartServer();
    }


    }
}

編輯1 :將所有調用更改為“ BeginInvoke”,並且凍結仍然持續。

感謝Wolf5及其鏈接, Thread.Abort()方法凍結了 通過停止線程中的所有服務並創建布爾工作。

    private void restartServer()
    {
      try { 
        try {
            check = false;
            tcpListener.Stop();
            textBox1.BeginInvoke((MethodInvoker)(() => textBox1.AppendText("Server stopping..\r\n")));
            t2.Abort();
            check = true;
            startThread();
        }
        catch(ThreadAbortException){

        }
         }  
        catch(ThreadAbortException)
      {
          Thread.ResetAbort();
      }
    }

因此,要點是讓CLR知道通過中止所有正在運行的服務來中止是安全的 謝謝! :D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM