怎样终止线程?(有代码)

o1234567890 2006-01-17 01:47:15
线程mm方法如下:
while (true)
{
listener.BeginAccept( new AsyncCallback(AcceptCallback),listener );//listener是监听套接字
Thread.Sleep(1000);
}
终止线程的方法如下:
mm.Abort()
错误:调用终止线程的方法时总是出现如下异常:
System.Threading.ThreadAbortException: 线程正被中止。
原因:线程中调用Thread.Sleep(100)造成的
大家给各解决的办法?谢谢啦
...全文
2571 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
o1234567890 2006-01-19
  • 打赏
  • 举报
回复
雨田的写法好像都不能停下来,我stop了,线程仍然在运行,又是一个奇怪的问题.
SkyeyGarden 2006-01-18
  • 打赏
  • 举报
回复
调用这个Abort方法就会产生异常的。。。
调用后用join方法
hainang1234 2006-01-18
  • 打赏
  • 举报
回复
是在被终止的线程捕获出来的吧?那是正常的,.NET就是用这个方法将线程终止的。你忽略这个异常就行了。

try
{
...//线程的执行
}
catch (ThreadAbortException)
{
//不作处理
}
catch (Exception)
{
...//相应处理
}
metra 2006-01-18
  • 打赏
  • 举报
回复
Thread.Abort( ) 是会throw ThreadAbortException,这个是正常的。

如果对源代码有控制,我不会用Thread.Abort( ) 终止线程。完全可以用 ManualResetEvent 比较圆满的解决。
DeeDee 2006-01-18
  • 打赏
  • 举报
回复
以下是我刚写的代码,你参考一下吧

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Network
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class Class1
{
private IPEndPoint ip_point;
private Socket listener;//监听套接字
protected Socket AcceptSocket;//与客户端连接的套接字
private bool stop=false;

public Class1(string ip,int port)
{
//
// TODO: 在此处添加构造函数逻辑
//
ip_point=new IPEndPoint(IPAddress.Parse(ip),port);
}

private void StartListen()
{

while (stop==false)
{
if (listener.Poll(10,SelectMode.SelectRead))
{
AcceptSocket=listener.Accept();
ThreadPool.QueueUserWorkItem(new WaitCallback(DoLogic));//从线程池中取一个线程响应连接
}
}
listener.Close();

}

public void Listen()
{
stop=false;
listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
listener.Bind(ip_point);
listener.Listen(10);
Thread thread = new Thread(new ThreadStart(StartListen));//启用一个线程后台监控
thread.Start();
}

public void Stop()
{
stop=true;

}

public void DoLogic(object obj)
{
//这里放置接受连接后的代码
}
}
}
crossrowman 2006-01-18
  • 打赏
  • 举报
回复
以上代码未经测试
crossrowman 2006-01-18
  • 打赏
  • 举报
回复
public class t_mm
{
private Thread mm;
private bool Stoped;
public t_mm()
{
mm = new Thread( new Thread..(ThreadFun()));
Stoped = false;
mm.Thread();
}
public Abort()
{
Stoped = true;
lock(this)
{
mm.Abort();
}
}
private ThreadFun()
{
while (Stoped)
{
listener.BeginAccept( new AsyncCallback(AcceptCallback),listener );//listener是监听套接字
lock(this)
{
Thread.Sleep(1000);
}
}
}
}
HengHuan 2006-01-18
  • 打赏
  • 举报
回复
帮顶
ycrw 2006-01-18
  • 打赏
  • 举报
回复
1.线程名称.Abort();
2.杀死线程
Dim myproc As System.Diagnostics.Process = New System.Diagnostics.Process
Dim proc As Process
Dim procs() As Process = Process.GetProcessesByName("要杀死的线程名称")
Try
For Each proc In procs
If Not proc.CloseMainWindow() Then
proc.Kill()
End If
Next
Catch
End Try
JasonHeung 2006-01-18
  • 打赏
  • 举报
回复
通过IsRun()来决定是否退出!
while (IsRun())
{
listener.BeginAccept( new AsyncCallback(AcceptCallback),listener );//listener是监听套接字
Thread.Sleep(1000);
}

//在下面加一个事件信号同步

我看你有戏 2006-01-17
  • 打赏
  • 举报
回复
学习
胖河马 2006-01-17
  • 打赏
  • 举报
回复
--ResetAbort()好像是:取消为当前线程请求的 Abort。但我就是想终止线程.

如果不调用ResetAbort,ThreadAbortException 异常将在catch 块的结尾再次引发,所以你因该调用ResetAbort,然后清理资源,然后return安全的结束线程
心情解码 2006-01-17
  • 打赏
  • 举报
回复
:)



jimh 2006-01-17
  • 打赏
  • 举报
回复
只有这样才比较方便处理了
catch(ThreadAbortException e)
消耗一点时间还是值得的。
diandian82 2006-01-17
  • 打赏
  • 举报
回复
up
o1234567890 2006-01-17
  • 打赏
  • 举报
回复
不行啊,对大家的热情参与表示感谢!顶
ZetaChow晓代码 2006-01-17
  • 打赏
  • 举报
回复
捕获,但不终止
ChengKing 2006-01-17
  • 打赏
  • 举报
回复
mm.Abort()

改为:

mm.Abort()
mm.Join()

试一下
o1234567890 2006-01-17
  • 打赏
  • 举报
回复
看来在现实面前,只能让异常发生了
Ivony 2006-01-17
  • 打赏
  • 举报
回复
你要中止线程,就一定会在线程内触发异常,一是帮助程序退出,二是告诉线程你被干掉了……
加载更多回复(6)

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧