【发布时间】:2011-10-16 22:03:05
【问题描述】:
正如标题所暗示的那样。 是的,我知道使用 .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(如其他论坛帖子中所建议的那样),但它没有任何区别。
【问题讨论】:
-
如果您知道
BeginAccept和EndAccept可以解决您的问题,为什么还要继续寻求不涉及这些方法的解决方案? -
因为我只希望同时打开 1 个连接。而且我知道使用 async 会大大扩展我的代码,所以我想我会尽可能简单地做到这一点。我猜这是不可能的,那我就用acceptasync吧。
标签: c# multithreading sockets abort forceclose