启动线程时,怎么关闭之前打开的线程

张池 2018-06-28 03:33:45
/// <summary>
/// 递增方法
/// </summary>
public static void doAdd()
{
//string threadID = "threadID:doAdd:" + Guid.NewGuid() + ":" + Thread.CurrentThread.ManagedThreadId.ToString();

//Console.WriteLine(threadID);

int i = 0;

Thread thread = new Thread(delegate (object param)
{

// 等待“停止”信号,如果没有收到信号则执行

while (!canStop)
{
Console.WriteLine(i++);
Thread.Sleep(1000);
}

// 此时已经收到停止信号,可以在此释放资源并
canStop = false;

});

thread.Start();//启动线程

}


点击按钮调用此方法,再点击时需关闭之前点击时启动的线程,如何实现


...全文
589 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小数点666 2018-07-04
  • 打赏
  • 举报
回复
把那个while(true)里的这个true标志提出来,然后等你点击下一个按钮的时候,把这个标志设为false,然后启动新线程
sp1234_maJia 2018-06-29
  • 打赏
  • 举报
回复
你可以看到,只要你的过程能把 canStop 重新设置为 false,那么一旦上述 test 方法执行过之后,在其它地方任何时候你设置
canStop = true;
都会很快再次执行 test2 方法。事件驱动设计是一个基本的实现异步流程设计的概念,你用的各种控件、组件都包含大量的事件。不理解事件驱动设计,就等于至少有一半的程序设计知识都没有学过,你之前所有的编程知识都应该结合事件驱动模式来重新学习一遍。

这样才能解决你的交互设计中遇到的基本的问题。
  • 打赏
  • 举报
回复
弄一堆的”死循环+阻塞语句“来轮询,不会事件驱动方式设计而是使用”线程死循环来模拟事件“,不理解异步,这是初学线程(即使这个人已经工作了10几年,但是可能一直就做一点 winform 或者 asp.net 的 OA小程序)的人的通病。
  • 打赏
  • 举报
回复
不要要说明的是,你这里的设计思路其实是一种”死循环+阻塞“的思路。这种代码对于初学者也许最容易”理解“,但是一旦任务负责一点,真正的并发多线程编程的大忌就是这类代码。每一个任务应该瞬间就结束了,是定时任务就用定时器、或者 await Task.Delay 作为控制引擎。

真正的并发多线程编程技术,是异步的。
  • 打赏
  • 举报
回复
引用 7 楼 u013438504 的回复:
引用 6 楼 scys1217 的回复:
[size=18px][color=#FF0000]我想每次进入doAdd方法的时候先关闭之前调用它启用的线程,但是直接写在标红1的地方,标红2肯定就不执行了


改变 canStop 为 true 之后,你需要等待/监听你的原来执行的线程把它重新改为 false 之后,才能开始启动你的新的线程。

所以 canStop 首先必须是一个方法——属性,而不是一个简单字段。其次它应该触发事件。例如
static event Action canStopChanged;
static bool _canStop = false;

static bool canStop
{
get { return _canStop; }
set
{
if (value != _canStop)
{
_canStop = value;
if (canStopChanged != null)
canStopChanged();
}
}


这样,你才能够监听canStop改变事件,例如
static void test()
{
canStopChanged += () => test2();
canStop = true;
}

static void test2()
{
if (!canStop)
{
//canStop已经重新设置为 false了,因此可以启动新任务了
}
}


张池 2018-06-28
  • 打赏
  • 举报
回复
引用 6 楼 scys1217 的回复:
我想每次进入doAdd方法的时候先关闭之前调用它启用的线程,但是直接写在标红1的地方,标红2肯定就不执行了
星先 2018-06-28
  • 打赏
  • 举报
回复
引用 5 楼 u013438504 的回复:
[quote=引用 4 楼 scys1217 的回复:]

public static void 结束线程(){
canStop=true;
}


这个结束线程方法在哪里用呢
[/quote]
主要是
canStop=true;
而不是这个方法。
你想在那控制线程结束,那就在那指定这个赋值。
张池 2018-06-28
  • 打赏
  • 举报
回复
引用 4 楼 scys1217 的回复:
public static void 结束线程(){
canStop=true;
}


这个结束线程方法在哪里用呢
星先 2018-06-28
  • 打赏
  • 举报
回复
bool canStop=false;
public static void doAdd()
{
//string threadID = "threadID:doAdd:" + Guid.NewGuid() + ":" + Thread.CurrentThread.ManagedThreadId.ToString();

//Console.WriteLine(threadID);

int i = 0;
if(!canStop){
Thread thread = new Thread(delegate (object param)
{

// 等待“停止”信号,如果没有收到信号则执行

while (true)
{
if(canStop)
break;
Console.WriteLine(i++);
Thread.Sleep(1000);
}

});

thread.Start();//启动线程
}

}
public static void 结束线程(){
canStop=true;
}
星先 2018-06-28
  • 打赏
  • 举报
回复
bool canStop=false;
public static void doAdd()
{
//string threadID = "threadID:doAdd:" + Guid.NewGuid() + ":" + Thread.CurrentThread.ManagedThreadId.ToString();

//Console.WriteLine(threadID);

int i = 0;
if(!startTR){
Thread thread = new Thread(delegate (object param)
{

// 等待“停止”信号,如果没有收到信号则执行

while (true)
{
if(startTR)
break;
Console.WriteLine(i++);
Thread.Sleep(1000);
}

});

thread.Start();//启动线程
}

}
public static void 结束线程(){
canStop=true;
}
张池 2018-06-28
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
你不是使用 canStop 标志吗?

然儿结果却是这样,不知道是那里写的不对还是怎么的


调用的地方是这么写的

DelegateThread delegateThread = new DelegateThread(DelegateThread.doAdd);
Thread th = new Thread(new ThreadStart(delegateThread.DoSomeThing));
th.IsBackground = true;
th.Start();
  • 打赏
  • 举报
回复
你不是使用 canStop 标志吗?

110,534

社区成员

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

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

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