[英]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.