正如标题所暗示的那样。 是的,我知道使用.abort()是可怕的,但是听我说出来
我正在使用2个线程,主线程(我的应用程序)和套接字监听线程(熟悉的声音有人吗?) 而不是使用异步.AcceptAsync()调用(tbh,主要原因是我没有看太多),我有线程只挂在socket.Accept(); 当然,当我调用thread.Abort()时,线程没有关闭,因为它仍然在等待连接,一旦它通过Accept()它就会中止就好了。
代码:
void listenserver()
{
while (run)
{
fConsole.WriteLine("Waiting for connections..");
connectedsock = mainsock.Accept();
connected = true;
fConsole.WriteLine("Got connection from: " + connectedsock.RemoteEndPoint);
... 和其他地方:
private void button_start_Click(object sender, EventArgs e)
{
if (!run)
{ //code ommitted.
}
else
{
run = false;
listenthread.Join(3000);
if (listenthread.IsAlive)
{
fConsole.WriteLine("Force-closing rogue listen thread");
listenthread.Abort();
}
button_start.Text = "Start";
groupBox_settings.Enabled = true;
}
有没有什么方法可以确保线程结束,而不是将整个东西塞进一个单独的应用程序然后结束呢? 请注意,我将thread.IsBackground设置为true(正如其他论坛帖子中所建议的那样),但它没有任何区别。
答案 0 :(得分:1)
由于您已经在使用线程,因此您也可以使用BeginAccept
。异步代码不需要使代码复杂化,因为您可以使用这样的lambdas:
var socket = new Socket(...);
socket.BeginAccept(result =>
{
if (this.abort)
{
// We should probably use a signal, but either way, this is where we abort.
return;
}
socket.EndAccept(result);
// Do your sockety stuff
}, null);
即使对AsyncCallback
使用单独的方法定义,代码也不复杂。
通过执行异步IO,您在CPU时间方面的效率也更高,因为在调用BeginAccept
和EndAccept
之间,线程可以重复用于其他处理。因为你在等待连接时没有使用它来进行任何有目的的操作,所以保持一个线程是没有意义和低效的。