定时启动多线程 的结束问题 在线等 有结果立刻结贴

weichangqing00 2010-11-05 10:14:49
我现在写了一个定时器 每隔一分钟 调用Entrance()方法启动线程 这样线程应该在那里结束? 是否在SendThreadProc和ReceiveThreadProc中 应该怎样写 (第二次调用的时候会出错:(XX线程正在终止))

PS:不能用While()来延期执行


public void Entrance()
{
this.sendThread = new Thread(new ThreadStart(SendThreadProc));
sendThread.Name = "Send Thread";
sendThread.Start();

this.receiveThread = new Thread(new ThreadStart(ReceiveThreadProc));
receiveThread.Name = "Receive Thread";
receiveThread.Start();
}

...全文
125 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
weichangqing00 2010-11-05
  • 打赏
  • 举报
回复
谢谢帮忙了 有个大致的方向 这个还是先不去判断他是否完成了任务了
weichangqing00 2010-11-05
  • 打赏
  • 举报
回复
去掉以后 下面的join 成了 为将对象引用到实例
weichangqing00 2010-11-05
  • 打赏
  • 举报
回复
if(sendThread == null)
return;
这个一直判断是空
去掉行不

weichangqing00 2010-11-05
  • 打赏
  • 举报
回复
#7 这样写是不是就不用再写一个线程了 这样直接停的是主线程

我两个子线程 是不是要这样写 if(sendThread.Join(1000)&&receiveThread.Join(1000))
cc_net 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 weichangqing00 的回复:]
能不能判断这个线程是否结束呢? 结束后再开启新的线程
[/Quote]

可以自己记录启动的线程状态,或则用信号量去做
机器人 2010-11-05
  • 打赏
  • 举报
回复
sorry少写句清零的代码:

//等待1秒,判断是否结束
if(sendThread.Join(1000))
{
//重启线程之前要把count清零
checkCount = 0;
RestartThread();
机器人 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 weichangqing00 的回复:]
我第二次 启动线程时 是否要去判断第一次的线程是否结束?不能用while()来写 因为这个是个后台程序 要考虑到连接数据库失败后是否会重新连接的问题 所以不能让线程一直循环执行 只能定时循环启动线程

这样行不?写个线程只是调用Entrance

C# code

public void Entrance()
{
while(。。。)
……
[/Quote]

用 Thread.Join(等待时间)

private int checkCount = 0;

//Entrance实际是每分钟调用一次的检查线程:
public void Entrance()
{
//如果线程不存在则退出
if(sendThread == null)
return;

//等待1秒,判断是否结束
if(sendThread.Join(1000))
{
RestartThread();
}
else
{
checkCount++;
}

//如果count大于3次,说明线程已经有3分钟以上没有响应了。
if(checkCount > 3)
{
//那么强制干掉,重启线程
try
{
sendThread.Abort();
}
catch
{}

checkCount = 0;
RestartThread();
}
}

private void RestartThread()
{
this.sendThread = new Thread(new ThreadStart(SendThreadProc));
sendThread.Name = "Send Thread";
sendThread.Start();

this.receiveThread = new Thread(new ThreadStart(ReceiveThreadProc));
receiveThread.Name = "Receive Thread";
receiveThread.Start();
}


weichangqing00 2010-11-05
  • 打赏
  • 举报
回复
能不能判断这个线程是否结束呢? 结束后再开启新的线程
机器人 2010-11-05
  • 打赏
  • 举报
回复
Thread.Abort()
但注意这会引发ThreadAbortException异常,如果就是强行终止线程的话,加上try...catch无视这个Exception


public void Entrance()
{
if(this.sendThread != null)
{
try
{ this.sendThread.Abort(); }
catch
{}
}
this.sendThread = new Thread(new ThreadStart(SendThreadProc));
sendThread.Name = "Send Thread";
sendThread.Start();

...
}

李先生2017 2010-11-05
  • 打赏
  • 举报
回复
用一个线程来管理线程,这个思路也是可以的,不过Slepp时间最好长一些吧,另外可以在SendThreadProc
和ReceiveThreadProc两个方法里面设置一个状态值,返回时置为True,然后在这个管理线程的方法里通过判断这个状态值来决定是否启动新的线程
weichangqing00 2010-11-05
  • 打赏
  • 举报
回复
我第二次 启动线程时 是否要去判断第一次的线程是否结束?不能用while()来写 因为这个是个后台程序 要考虑到连接数据库失败后是否会重新连接的问题 所以不能让线程一直循环执行 只能定时循环启动线程

这样行不?写个线程只是调用Entrance

public void Entrance()
{
while(。。。)
{
this.sendThread = new Thread(new ThreadStart(SendThreadProc));
sendThread.Name = "Send Thread";
sendThread.Start();

this.receiveThread = new Thread(new ThreadStart(ReceiveThreadProc));
receiveThread.Name = "Receive Thread";
receiveThread.Start();

Thread。Sleep(XX);
}
}

李先生2017 2010-11-05
  • 打赏
  • 举报
回复
线程是系统用来执行任务的资源单元,在线程中执行的方法返回或退出后线程自然结束,系统回收相关资源
所以楼主不必担心线程的结束问题,只要你给它的方法执行返回后,自然就结束了。
while(!_shouldStop)
{
//do something
Thread.Sleep(100);
}
机器人 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 weichangqing00 的回复:]
if(sendThread == null)
return;
这个一直判断是空
去掉行不
[/Quote]

加上创建的代码就OK了。
if(sendThread == null)
{
RestartThread();
}

count用于控制线程的生命 1:就是1分钟,2:就是2分钟 。。。
看你要线程活多久重新创建。或者说你程序如何设计线程的工作。
是短期工作然后必需重启呢?还是长期工作需要判断启动正常?

如果只是数据库连接不上要重新创建,不应该用这种方式。

110,538

社区成员

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

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

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