如何立刻停止当前线程

Ncrazy 2020-07-18 05:37:40
打个比方

private void doSth(object sender,DoWorkEventArgs e)
{
bw = sender as BackgroundWorker;

int i = 0;
while (i <= 10)
{
if (bw.CancellationPending)
{
e.Cancel = true;
break;
}
for (int j = 1; j < 500; j++)
{
Thread.Sleep(100);
Console.WriteLine(j.ToString());
}
bw.ReportProgress(i++);

System.Threading.Thread.Sleep(100);

}

}

这样我加个按钮直接就CancelAsync,他也会把for循环运行结束,如何直接就强行结束当前线程,而不继续执行之后的操作。
...全文
5620 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
杀马特丶蛮牛 2020-07-20
  • 打赏
  • 举报
回复
如果时thread的话,有个方法时thrad.abort()可以强制退出的
github_36000833 2020-07-19
  • 打赏
  • 举报
回复
回归正题。希望随时停止线程,就要控制单元工作的粒度。粒度的大小,决定了“随时”的程度。 有些单元工作是不好半途终止的,比如一个覆盖文件的操作,比如一个分布锁必须得到释放。 单元工作不能打断,但单元工作之间就可以检查任务取消。 现实就是随时停止线程行不通的,但你可以控制到用户满意的程度。
Ncrazy 2020-07-19
  • 打赏
  • 举报
回复
随时停止是指随时可以通知一声的一种手段,而不是就要炸了手术室,也不是拔电源强杀进程,而是电脑有接收装置可以远程控制随时控制自动停止。
github_36000833 2020-07-19
  • 打赏
  • 举报
回复
引用 6 楼 以专业开发人员为伍 的回复:
线程是一种控制,而已。比如说一台外科手术正在进行,护士想让主刀医生出来接一下电话,她不通知医生而是直接把手术室炸了,这种“停止”操作微软不会提供的。
+1 更改最后一句,使字面上显得严谨些:这种“停止”操作微软不会提议的。 禁不住有人会拔电源强杀进程/线程。
  • 打赏
  • 举报
回复
线程是一种控制,而已。比如说一台外科手术正在进行,护士想让主刀医生出来接一下电话,她不通知医生而是直接把手术室炸了,这种“停止”操作微软不会提供的。
  • 打赏
  • 举报
回复
你想什么时候不放弃退出时机,就什么时候检测。
Ncrazy 2020-07-18
  • 打赏
  • 举报
回复
引用 1 楼 番茄爱上蛋 的回复:
感觉你这一段代码是在主线程上运行的,如果你想能中断线程,也许应该新起一个线程。
并不是在主线程上,只是想知道有没有办法直接终止。
Ncrazy 2020-07-18
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍 的回复:
[quote=引用 楼主 Ncrazy 的回复:]打个比方

private void doSth(object sender,DoWorkEventArgs e)
{
        bw = sender as BackgroundWorker;
            
        int i = 0;
        while (i <= 10)
        {
            if (bw.CancellationPending)
            {
                    e.Cancel = true;
                    break;
            }
            for (int j = 1; j < 500; j++)
            {
                    Thread.Sleep(100);
                    Console.WriteLine(j.ToString());
            }
            bw.ReportProgress(i++);

            System.Threading.Thread.Sleep(100);

     }
            
}
这样我加个按钮直接就CancelAsync,他也会把for循环运行结束,如何直接就强行结束当前线程,而不继续执行之后的操作。
你为什么不在 for 循环也检查退出信号呢?[/quote] 后面如果不是一个循环呢 ,难道是隔一段代码加一次检测
  • 打赏
  • 举报
回复
引用 楼主 Ncrazy 的回复:
打个比方

private void doSth(object sender,DoWorkEventArgs e)
{
bw = sender as BackgroundWorker;

int i = 0;
while (i <= 10)
{
if (bw.CancellationPending)
{
e.Cancel = true;
break;
}
for (int j = 1; j < 500; j++)
{
Thread.Sleep(100);
Console.WriteLine(j.ToString());
}
bw.ReportProgress(i++);

System.Threading.Thread.Sleep(100);

}

}

这样我加个按钮直接就CancelAsync,他也会把for循环运行结束,如何直接就强行结束当前线程,而不继续执行之后的操作。


你为什么不在 for 循环也检查退出信号呢?
番茄爱上蛋 2020-07-18
  • 打赏
  • 举报
回复
感觉你这一段代码是在主线程上运行的,如果你想能中断线程,也许应该新起一个线程。

111,093

社区成员

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

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

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