none
Thread.Sleep和Task.Delay 怎么 取消等待时间 ?或其他函数

    问题

  •                 Thread.Sleep(5000);  这个 没有找到 可以取消时间 的东西
                 

     下面

     CancellationTokenSource Get= new CancellationTokenSource();

                   

                try
                    {
                        await Task.Delay(5000, Get.Token);
                        richTextBox1.Text += "程序开始运行\n";
                    }
                    catch { richTextBox1.Text += "已经取消"; }

     Get.Cancel();

    必须要try  才能不会出错 

    有没有可以直接取消不会出错的办法?  或其它可以使用的函数?


    2017年3月2日 16:26

答案

  • Hi,

    你是想打断正在休眠的程序吗?

    你可以尝试使用Monitor.Wait 带有一个超时时间。

    然后使用Monitor.Pulse 去唤醒.

    下面是参考代码:

    lock (monitor)
    {
        // If we've already been told to quit, we don't want to sleep!
        if (somethingIndicatingQuit)
        {
            break;
        }
        Monitor.Wait(monitor, TimeSpan.FromSeconds(10));
        if (somethingIndicatingQuit)
        {
            break;
        }
    }
    
    // To wake it up...
    lock (monitor)
    {
        somethingIndicatingQuit = true;
        Monitor.Pulse(monitor);
    }

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ning050089 2017年3月3日 7:47
    2017年3月3日 5:33
    版主
  • 我写了个伪 task  有需要的可以抄下

                                          

     class Taketime   \\自定义类
        {
           public int h;
            CancellationTokenSource Get = new CancellationTokenSource();


            public async  Task Delay(int  time)
            {
                try
                {
                    await Task.Delay(time, Get.Token);
                }
                catch
                { if (h == 1)
                    {
                        Get = new CancellationTokenSource();
                    }
                    else { }
                }
            }
           public void Cancle()
            {
                h = 0;
                Get.Cancel();

            }
            public void Run()
            {
                h = 1;
                Get = new CancellationTokenSource();

            }


        }
    }

     

    代码运行

    Taketime Take = new Taketime();

           {      Take.Run();
                    await Take.Delay(5000);
                    richTextBox1.Text += "程序开始运行\n";
                    await Take.Delay(5000);
                    richTextBox1.Text += "已经取消\n"; } ///// 

    取消运行    Take.Cancle();// 取消所有引用

    如一步步取消
      Get.Cancel(); h = 0;    换下位置就可以了

    • 已标记为答案 ning050089 2017年3月3日 9:34
    2017年3月3日 9:32

全部回复

  • Hi,

    你是想打断正在休眠的程序吗?

    你可以尝试使用Monitor.Wait 带有一个超时时间。

    然后使用Monitor.Pulse 去唤醒.

    下面是参考代码:

    lock (monitor)
    {
        // If we've already been told to quit, we don't want to sleep!
        if (somethingIndicatingQuit)
        {
            break;
        }
        Monitor.Wait(monitor, TimeSpan.FromSeconds(10));
        if (somethingIndicatingQuit)
        {
            break;
        }
    }
    
    // To wake it up...
    lock (monitor)
    {
        somethingIndicatingQuit = true;
        Monitor.Pulse(monitor);
    }

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ning050089 2017年3月3日 7:47
    2017年3月3日 5:33
    版主
  • 我写了个伪 task  有需要的可以抄下

                                          

     class Taketime   \\自定义类
        {
           public int h;
            CancellationTokenSource Get = new CancellationTokenSource();


            public async  Task Delay(int  time)
            {
                try
                {
                    await Task.Delay(time, Get.Token);
                }
                catch
                { if (h == 1)
                    {
                        Get = new CancellationTokenSource();
                    }
                    else { }
                }
            }
           public void Cancle()
            {
                h = 0;
                Get.Cancel();

            }
            public void Run()
            {
                h = 1;
                Get = new CancellationTokenSource();

            }


        }
    }

     

    代码运行

    Taketime Take = new Taketime();

           {      Take.Run();
                    await Take.Delay(5000);
                    richTextBox1.Text += "程序开始运行\n";
                    await Take.Delay(5000);
                    richTextBox1.Text += "已经取消\n"; } ///// 

    取消运行    Take.Cancle();// 取消所有引用

    如一步步取消
      Get.Cancel(); h = 0;    换下位置就可以了

    • 已标记为答案 ning050089 2017年3月3日 9:34
    2017年3月3日 9:32