• C#异步编程的实现方式(4)——Task任务


    最基本的是知道怎么启动一个Task。

    1、Task类构造函数

    使用Task类的构造函数。实例化Task对象时,任务不会立即运行,而是指定Created状态。接着调用Task类的Start()方法来启动任务。使用Task类时,除了调用Start()方法,还可以调用RunSynchronously()方法。这样,任务也会启动,但是同时调用。默认情况下,任务是异步运行的。

    Task类的构造函数接收一个无参无返回值的委托:

       1: Task task = new Task(TaskMethod);
        
       2: task.Start();

    下面是TaskMethod方法:

       1: static void TaskMethod()
        
       2: {
        
       3:     for (int i = 0; i < 10; i++)
        
       4:     {
        
       5:         Console.WriteLine(String.Format("Running in a task. Task ID: {0}", Task.CurrentId));
        
       6:         Thread.Sleep(500);
        
       7:     }
        
       8: }

    方法里用Task.CurrentId属性取得当前任务ID。下面是主线程:

       1: static void Main(string[] args)
        
       2: {
        
       3:     Task task = new Task(TaskMethod);
        
       4:     task.Start();
        
       5:  
        
       6:     for (int i = 0; i < 10; i++)
        
       7:     {
        
       8:         Console.WriteLine("Running in main thread.");
        
       9:         Thread.Sleep(500);
        
      10:     }
        
      11:     
        
      12:     Console.Read();
        
      13: }

    如果要往线程里传递参数,Task构造函数提供的重载,可以传入一个object类型的参数:

       1: Task task = new Task(TaskMethodWithParameter, "Hello world");
        
       2: task.Start();

    下面是带参的线程方法:

       1: static void TaskMethodWithParameter(object param)
        
       2: {
        
       3:     for (int i = 0; i < 10; i++)
        
       4:     {
        
       5:         Console.WriteLine(String.Format("Running in a task. Parameter: {0}", param));
        
       6:         Thread.Sleep(500);
        
       7:     }
        
       8: }
      

    2、TaskFactory类

    使用实例化的TaskFactory类,在其中把TaskMethod方法传递给StartNew()方法,就会立即启动任务。

       1: TaskFactory tf = new TaskFactory();
        
       2: tf.StartNew(TaskMethod);
      

    3、Task.Factory属性

    Task类提供了一个Factory静态属性,这个属性返回一个TaskFactory对象。

       1: Task task = Task.Factory.StartNew(TaskMethod);
  • 相关阅读:
    机器学习篇:sklearn.datasets
    Java篇:Java网络编程(二)网络地址及端口
    机器学习篇:sklearn.model_selection
    实践 12:多线程读写文件
    机器学习篇:循环神经网络RNN
    Java篇:Java网络编程(三)URL
    Java篇:Java网络编程(一)网络分层
    Java篇:Java的安全模型
    DataTable无法使用AsEnumerable ()的解决办法
    问一个关于WPF调用axWindowsMediaPlayer播放不稳定的问题,大侠们给个建议!谢了
  • 原文地址:https://www.cnblogs.com/DTWolf/p/4645499.html
Copyright © 2020-2023  润新知