• C#协作试取消线程


    https://segmentfault.com/q/1010000017109927

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace 取消线程池中线程 { class Program { static void Main(string[] args) { Console.WriteLine( "主线程运行" ); CancellationTokenSource cts = new CancellationTokenSource( ); //ThreadPool.QueueUserWorkItem(CallBack, cts.Token ); ThreadPool.QueueUserWorkItem(CallBack, cts); Console.WriteLine( "按下回车键取消启动的线程" ); Console.Read( ); cts.Cancel(); Console.ReadKey(); } public static void CallBack( object state ) { CancellationTokenSource cts = (CancellationTokenSource)state; Console.WriteLine( "开始计数" ); Count( cts, 5 ); } private static void Count(CancellationTokenSource cts, int countto ) { for( int i=0; i<=countto+10; ++i) { if( i== countto) { cts.Cancel(); Console.WriteLine( "计算取消" ); //return; } Console.WriteLine( "计算为:{0}, 当前线程ID: {1}", i, Thread.CurrentThread.ManagedThreadId ); Thread.Sleep(300); } Console.WriteLine("计数完成"); } } }

    clipboard.png

    很明显在调用cts.Cancel()后Count()函数还在执行,看到书上说CancellationTokenSource是协助式取消线程,刚学多线程,很多不明白的。
    我们将一些任务(函数)放在某一个线程中执行,如果任务终止是不是就代表线程取消了
    上述代码如果改为:

    if( i== countto) {
        cts.Cancel();
        Console.WriteLine( "计算取消" );
        return;
    }

    这样是不是就可以正确的取消线程。

    回复
    阅读 838
     
     
    1 个回答
     

    在 Count 方法中需要使用 cts.IsCancellationRequested 来判断当前线程是否已经被取消。

    if (cts.IsCancellationRequested)
    {
        Console.WriteLine( "计算取消" );
        return;
    }
     
  • 相关阅读:
    vijos1776:关押罪犯
    vijos1774:机器翻译
    vijos1775:乌龟棋
    vijos1792:摆花
    vijos1100:加分二叉树
    vijos1706:舞会
    单调栈
    bzoj1677:求和
    bzoj1340: [Baltic2007]Escape逃跑问题
    bzoj4716: 假摔
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14907204.html
Copyright © 2020-2023  润新知