none
如何停止一个正在执行的Threading.Tasks.Task? RRS feed

  • 问题

  • 最近把一些2.0的代码升级到4.0,把原来用Thread写的部分改用Task进行重写。

    但没找到停止Task的方法,不像Thread类中直接有停止该线程的方法。

    哪位知道,或发一个相关讲解的链接过来,谢谢


    --!
    2011年10月6日 14:51

答案

  • namespace A
    {
        public class MainTest
        {
            static void Do(CancellationTokenSource ct)
            {
                Random r = new Random(DateTime.Now.Millisecond);

                for (int i = 1i < 100i++)
                {
                    if (!ct.IsCancellationRequested)
                    {
                        Thread.Sleep(r.Next(5001000));
                        Console.WriteLine(i);
                    }
                    else
                    {
                        Console.WriteLine("任务取消了……");
                        break;
                    }
                }
            }
            static void Main(string[] args)
            {
                Random r = new Random(DateTime.Now.Millisecond);
                CancellationTokenSource ct = new CancellationTokenSource();
                Task t = new Task(()=>Do(ct));
                t.Start();
                Thread.Sleep(r.Next(1000,9999));
                ct.Cancel();
            }
        }
    }
    摘录自:http://www.cnblogs.com/myshell/archive/2010/03/23/1692059.html

    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月7日 3:17
    版主

全部回复

  • namespace A
    {
        public class MainTest
        {
            static void Do(CancellationTokenSource ct)
            {
                Random r = new Random(DateTime.Now.Millisecond);

                for (int i = 1i < 100i++)
                {
                    if (!ct.IsCancellationRequested)
                    {
                        Thread.Sleep(r.Next(5001000));
                        Console.WriteLine(i);
                    }
                    else
                    {
                        Console.WriteLine("任务取消了……");
                        break;
                    }
                }
            }
            static void Main(string[] args)
            {
                Random r = new Random(DateTime.Now.Millisecond);
                CancellationTokenSource ct = new CancellationTokenSource();
                Task t = new Task(()=>Do(ct));
                t.Start();
                Thread.Sleep(r.Next(1000,9999));
                ct.Cancel();
            }
        }
    }
    摘录自:http://www.cnblogs.com/myshell/archive/2010/03/23/1692059.html

    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月7日 3:17
    版主
  • 如果在Do方法中不加CancellationTokenSource参数,方法体中也没有判断IsCancellationRequested这类协作取消任务。

    只是在外部单纯的调用ct.Cancel方法,Task会被取消吗?


    --!
    2011年10月7日 3:51
  • 如果在Do方法中不加CancellationTokenSource参数,方法体中也没有判断IsCancellationRequested这类协作取消任务。

    只是在外部单纯的调用ct.Cancel方法,Task会被取消吗?


    --!
    不会的。
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月7日 4:56
    版主
  • 这样和我自己设置一个标记来停止Task有什么区别呢?


    --!
    2011年10月7日 6:01
  • 这样和我自己设置一个标记来停止Task有什么区别呢?


    --!


    什么意思?什么叫“自己设置一个标记停止Task?”

    你不是说你不会停止Task么?怎么又会了?


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月7日 6:03
    版主
  • 我的意思是,我设置一个例如bool的变量,然后在外部设置此bool为false的时候,task中的 while(thisbool)就不再执行,这样task就结束了。

    因为这个task里while段中循环执行的部分仍需要消耗大量的时间,我想要类似Thread.Abort这类能够强制中止task的方法


    --!
    2011年10月9日 1:42
  • 我的意思是,我设置一个例如bool的变量,然后在外部设置此bool为false的时候,task中的 while(thisbool)就不再执行,这样task就结束了。

    但是你不要忘记——while一旦进入循环,即便你设置为true,也无济于事——因为已经死循环了。

    比如:

    bool thisbool = true;

    while(thisbool)

    {

       ………………

    }

    thisbool=false;   //这句话永远也不会达到的

    或者你举例子呢?谢谢


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月9日 1:46
    版主
  • bool thisbool是类内的变量,而不是在方法中。

    这样类内其他成员只要修改,task中的while(thisbool)就会跳出了。

    在以前使用Thread的时候,我都是这么做的,为的就是在不必须的时候,可以让线程内执行完当次操作并做一定处理后再结束。

    而在必要时,我还可以使用Abort来强制中止该线程,但到Task后,我就不知道用什么来替代Abort这个方法了。


    --!
    2011年10月9日 2:25
  • 从4.0 新增了Task后,要取消task,估计都是用的Wei_Dong 所提到的: CancellationTokenSource.Cancel

    MSDN上的链接: http://msdn.microsoft.com/zh-cn/library/dd321703.aspx

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月10日 3:01
    版主