.NET 4 并行(多核)编程系列之四 Task的休眠

  前言:之前的几篇文章断断续续的介绍了Task的一些功能:创建,取消。本篇介绍Task的休眠,本篇的内容比较的少。

  本篇的议题如下:

  1.       Task的休眠。

 

  系列文章链接:

  .NET 4 并行(多核)编程系列之一入门介绍

  .NET 4 并行(多核)编程系列之二 从Task开始 

  .NET 4 并行(多核)编程系列之三 从Task的取消 

  .NET 4 并行(多核)编程系列之四 Task的休眠 

  .NET 并行(多核)编程系列之五 Task执行和异常处理 

  .NET 并行(多核)编程系列之六 Task基础部分完结篇 

下面就讲讲休眠的方法:

 

  a.       使用CancellationTokenWait Handle

  a)         .NET 4并行编程中,让一个Task休眠的最好的方式就是使用CancellationToken的等待操作(Wait Handle)。而且操作起来也很简单:首先创建一个CancellationTokenSource的实例,然后通过这个实例的Token属性得到一个CancellationToken的实例,然后在用CancellationTokenWaitHandle属性,然后调用这个这个属性的WaitOne()方法。其实在之前讲述”Task的取消一文中就已经使用过。

 

  b)         WaitOne()方法有很多的重载方法来提供更多的功能,例如可以传入一个int的整数,表明要休眠多长的时间,单位是微秒,也可以传入一个TimeSpan的值。如果调用了CancellationTokenCancel()方法,那么休眠就立刻结束。就是因为这个原因,我们之前的文章讲过,WaitOne()可以作为检测Task是否被取消的一个方案

下面来看一段示例代码:

        static void Main(string[] args)
        {
            
// create the cancellation token source
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            
// create the cancellation token
            CancellationToken token = tokenSource.Token;

            
// create the first task, which we will let run fully
            Task task1 = new Task(() =>
            {
                
for (int i = 0; i < Int32.MaxValue; i++)
                {
                    
// put the task to sleep for 10 seconds
                    bool cancelled = token.WaitHandle.WaitOne(10000);
                    
// print out a message
                    Console.WriteLine("Task 1 - Int value {0}. Cancelled? {1}",
                    i, cancelled);
                    
// check to see if we have been cancelled
                    if (cancelled)
                    {
                        
throw new OperationCanceledException(token);
                    }
                }
            }, token);
            
// start task
            task1.Start();

            
// wait for input before exiting
            Console.WriteLine("Press enter to cancel token.");
            Console.ReadLine();

            
// cancel the token
            tokenSource.Cancel();

            
// wait for input before exiting
            Console.WriteLine("Main method complete. Press enter to finish.");
            Console.ReadLine();
        }

相关文章:

  • 2021-06-05
  • 2022-02-20
  • 2021-12-04
  • 2021-10-26
  • 2021-09-28
  • 2021-10-10
猜你喜欢
  • 2021-06-09
  • 2021-07-25
  • 2021-11-20
  • 2022-01-23
  • 2022-12-23
  • 2021-07-31
相关资源
相似解决方案