none
CancellationTokenSource.Token 能否复位? RRS feed

  • 问题

  • 不知道问题问得对不对,CancellationTokenSource.Cancel() 退出 Task 后,想再次启动同一 Task ,貌似不行:

            private void button1_Click(object sender, EventArgs e)
            {
                Thread t1 = new Thread(ThreadMain);  //用线程,避免阻塞界面
                t1.Start();
            }
     
            CancellationTokenSource cts = new CancellationTokenSource();
            public void ThreadMain()
            {
                int count = 0;
                while (count < 5)   //要循环5次
                {
                    count++;
     
                    //此处应该如何操作cts或者cts.Token,让第一次cts.Cancel()后能够在此复位,以继续正常运行Task???
                    Task.Factory.StartNew(MyTask, cts.Token); 
     
                    Thread.Sleep(5 * 1000); //等待任务执行5秒
     
                    cts.Cancel();   //取消任务
     
                    richTextBox1.Text += "count = " + count.ToString() + "\r\n";   
                }
     
                richTextBox1.Text += "已停止";   
            }
     
            public void MyTask()       
            {
                while (!cts.IsCancellationRequested)   //判断是否取消任务,由上面的cts.Cancel()控制
                {
                    richTextBox1.Text += DateTime.Now + "\r\n";
     
                    Thread.Sleep(1000);
                }
            }

    目前运行结果如下:
    2015/4/11 14:43:23
    2015/4/11 14:43:24
    2015/4/11 14:43:25
    2015/4/11 14:43:26
    2015/4/11 14:43:27
    count = 1
    count = 2
    count = 3
    count = 4
    count = 5
    已停止

    就是说第一次运行了Task,并cts.Cancel()后,Task再也没有运行了
    怎么让cts.Cancel()后复位,让Task能够再次正常运行呢?

    感谢各位大虾指导,^_^

    2015年4月11日 8:06

答案

全部回复

  • 你好,

    我查阅了一些文档,似乎没有复位这种说法,Cancel的意思也是撤销,所以抛去你的代码我建议你可以重新建立一个CancellationTokenSource并生成一个新的token,例如:

    private void Start_Click(object sender, RoutedEventArgs e)
    {
        cts = new CancellationTokenSource();           
        var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
        CancellationToken token = cts.Token;
    ...

    一些具体的操作我建议你阅读一下这里 https://msdn.microsoft.com/zh-cn/library/dd997364(v=vs.110).aspx

    另外连个具体的例子,可以参看这里:

    https://msdn.microsoft.com/zh-cn/library/dd997396(v=vs.110).aspx

    https://msdn.microsoft.com/zh-cn/library/dd537607%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396分别是取消任务和取消任务子集。



    Barry
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年4月14日 2:18
    版主
  • Cancel 後,等於取消了,就沒辦法再進去了,只可以重新執行task

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆標示為解答以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to clickMark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2015年4月14日 5:43
  • ?????
    2015年4月15日 1:42