У меня возникла следующая проблема: я создал простой компонент HTTP-сервера. Сервер должен управляться с помощью кнопок в графическом интерфейсе. Я могу запустить сервер без проблем, но если я хочу остановить сервер, вся программа будет убита. Я думаю, что это ошибка прерывания потока, но я не знаю, как я могу решить эту проблему.Exit Thread и TcpListener в C#
Вот мой код:
public class HttpServer {
private int port;
public HttpServer(int port) {
this.port = port;
}
public void Listen() {
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
try {
while (true) {
TcpClient client = listener.AcceptTcpClient();
HttpProcessor processor = new HttpProcessor(client);
Thread thread = new Thread(new ThreadStart(processor.Process));
thread.Start();
Thread.Sleep(1);
}
}
catch { }
listener.Stop();
}
}
public class HttpProcessor {
private TcpClient client;
private StreamReader reader;
private StreamWriter writer;
public HttpProcessor(TcpClient client) {
this.client = client;
this.reader = null;
this.writer = null;
}
public void Process() {
reader = new StreamReader(client.GetStream());
writer = new StreamWriter(client.GetStream());
ParseRequest();
// some method calls to process the request and generate the response
SendResponse();
client.Close();
}
}
public partial class MainForm : Form {
private HttpServer server;
private Thread servthread;
private void Form_Load(object sender, EventArgs e) {
server = new HttpServer(8080);
}
private void Button1_Click(object sender, EventArgs e) {
servthread = new Thread(new ThreadStart(server.Listen));
servthread.Start();
Thread.Sleep(1);
}
private void Button2_Click(object sender, EventArgs e) {
servthread.Abort();
}
}
Возможно, вам стоит попытаться закрыть и другие объекты правильно, и вы можете подумать, действительно ли вам нужны два потока. – Rafa
Do * not ever * use 'Thread.Abort()'! –