您好,登录后才能下订单哦!
这篇文章主要讲解了“C#怎么同时取消多个线程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么同时取消多个线程”吧!
几点关键问题解释:
同时取消多个线程:
有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消
如下:我们点击一个按钮开启线程,然后点击取消按钮取消该线程的执行
CancellationTokenSource cts ; /// <summary> /// 开启线程 /// </summary> private void button1_Click(object sender, EventArgs e) { //重新实例化cts.Token就会不一样,不然再次点击的时候会报错,提示线程已经执行完毕 cts = new CancellationTokenSource(); Task task = new Task(() => { Thread.Sleep(1500); try { cts.Token.ThrowIfCancellationRequested(); MessageBox.Show("线程被执行"); } catch (Exception ex) { MessageBox.Show("线程被取消"); } }, cts.Token); task.Start(); //如果放到这里有可能线程还没有开始执行就被取消了 //cts.Cancel(true); } /// <summary> /// 取消线程 /// </summary> private void button2_Click(object sender, EventArgs e) { cts.Cancel(); }
1:为什么线程里边去调用 Thread.Sleep(1500);
因为如果不让线程暂停一下,你在点击开启线程后。还没有来得及点击取消线程,线程都已经执行完毕了这个时候
再去取消线程是没有什么意义的。
2: cts.Cancel()
这句话其实只是设置一个状态,设置该对象一个熟悉为true而已,也就是设置cts.IsCancellationRequested为ture。
所以他根本没有真正的去取消线程的执行,只是设置一个状态而已。
3:cts.Token.ThrowIfCancellationRequested();
因为上面说的cts.Cancel()只是设置一个状态而已,线程不会真正被取消。其实线程开启后,现在都是要执行完的,
我们并不能真正去取消线程的执行,只是从逻辑上去取消线程需要处理的逻辑。
这句话的意思其实就是检查cts.Cancel()设置的属性状态,也就是cts.IsCancellationRequested是否为true,如果为
true就抛出一个异常,从而终止线程的执行
也就是说其实这句话完全可以我们自己来实现
同时取消多个线程,其实也很简单,我们不需要有多少个线程就去实例化多少个CancellationTokenSource,
多个线程绑定顶一个CancellationTokenSource的token然后调用该对象的cancel就可以同时取消多个线程了。
CancellationTokenSource cts; /// <summary> /// 开启线程 /// </summary> private void button1_Click(object sender, EventArgs e) { //重新实例化cts.Token就会不一样,不然再次点击的时候会报错,提示线程已经执行完毕 cts = new CancellationTokenSource(); for (int i = 0; i < 5; i++) { Task task = new Task((obj) => { Thread.Sleep(1500); try { //cts.Token.ThrowIfCancellationRequested(); //检查状态,检查线程是否已经被取消,如果取消则自己跑出来一个线程 if (cts.Token.IsCancellationRequested) throw new OperationCanceledException(); MessageBox.Show("线程" + obj + "被执行"); } catch (Exception ex) { MessageBox.Show("线程" + obj + "被取消"); } }, i, cts.Token); task.Start(); } //如果放到这里有可能线程还没有开始执行就被取消了 //cts.Cancel(true); } /// <summary> /// 取消线程 /// </summary> private void button2_Click(object sender, EventArgs e) { cts.Cancel(); }
感谢各位的阅读,以上就是“C#怎么同时取消多个线程”的内容了,经过本文的学习后,相信大家对C#怎么同时取消多个线程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。