zoukankan      html  css  js  c++  java
  • Task

    Task

    使用

    Task以及Task.Factory都是在.Net 4引用的。Task跟Thread很类似,通过下面例子可以看到。

    1. static public void ThreadMain()  
    2. {  
    3.     Thread t1 = new Thread(TaskWorker);  
    4.     t1.Start(3);  
    5. }  
    6.   
    7. static public void TaskMain()  
    8. {  
    9.     Task t1 = new Task(TaskWorker, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);  
    10.     Console.WriteLine(t1.Status);  
    11.     t1.Start();  
    12.     t1.Wait(); // need to wait for finishing.  
    13. }  
    14.   
    15. static public void TaskWorker(object state)  
    16. {  
    17.     int nTime = (int)state;  
    18.     for (int i = 0; i < nTime; i++)  
    19.     {  
    20.         Thread.Sleep(100);  
    21.         Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));  
    22.     }  
    23.     return;  
    24. }  

    我们看到TaskWorker都是用于Task以及Thread,都是只能接受一个参数(Action<object>),不过task可以支持工作函数具有返回值(Func<TRessult>()或者Func<object, TResult>)。但是弱的类型输入跟thread一样。Task提供返回值是为了后面说到的task结构层次有用。

    下面是调用一个具有返回值的工作函数

    1. static public int TaskWorkerWithReturn(object state)  
    2. {  
    3.     int nTime = (int)state;  
    4.     for (int i = 0; i < nTime; i++)  
    5.     {  
    6.         Thread.Sleep(100);  
    7.         Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));  
    8.     }  
    9.     nTime++;  
    10.     return nTime;  
    11. }  
    1.   

    主调函数为:

    1. Task<int> t2 = new Task<int>(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);  
    2. t2.Start();  
    3. t2.Wait();  
    4. Console.WriteLine(t2.Result);  

    不管从工作函数是否有返回值,task都需要在其运行过程中至少有一个前台线程在跑,否则会直接退出,根本原因是所有task都是后台线程。task的工作函数的输入参数类型职能是object。

    同步

    对于没有返回值的工作函数需要通过内核对象来同步主调线程(例如task内置的事件,使用wait来阻塞等待);

    对于有返回值的工作函数可以通过访问其Result函数来实现阻塞等待。

    1. static public int TaskWorkerWithReturn(object state)  
    2. {  
    3.     int nTime = (int)state;  
    4.     for (int i = 0; i < nTime; i++)  
    5.     {  
    6.         Thread.Sleep(100);  
    7.         Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));  
    8.     }  
    9.     nTime++;  
    10.     return nTime;  
    11. }  

    主调函数:

    1. Task<int> t2 = new Task<int>(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);  
    2. t2.Start();  
    3. Console.WriteLine("t2:" + t2.Result);  

    异步调用

    作为新的一个特性在.net 4中引入,task能实现丰富的异步调用,使用成员函数ContinueWith来响应异步工作函数的完成,注意,不一定由之前完成异步函数的线程执行

    1. static public void TaskMain()  
    2. {  
    3.     Task<int> t3 = new Task<int>(FirstTask, 1);  
    4.     t3.Start();  
    5.     Task<int> t4 = t3.ContinueWith<int>(RecusiveTask);  
    6.     Task<int> t5 = t4.ContinueWith<int>(RecusiveTask);  
    7.     Task<int> t6 = t5.ContinueWith<int>(RecusiveTask).ContinueWith<int>(RecusiveTask);  
    8.     //Console.WriteLine(string.Format("final result: {0}", t6.Result));  
    9. }  
    10.   
    11. static public int FirstTask(object state)  
    12. {   
    13.     int data = (int)state;  
    14.     for (int i = 0; i < data; i++)  
    15.     {  
    16.         Thread.Sleep(100);  
    17.         Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));  
    18.     }  
    19.     data++;  
    20.     return data;  
    21. }  
    22.   
    23. static public int RecusiveTask(Task<int> T)  
    24. {  
    25.     int data = T.Result;  
    26.     for (int i = 0; i < data; i++)  
    27.     {  
    28.         Thread.Sleep(100);  
    29.         Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));  
    30.     }  
    31.     data++;  
    32.     return data;  
    33. }  

    输出结果为:

    1. current thread 1 slept for 100 milisecond.  
    2. current thread 2 slept for 100 milisecond.  
    3. current thread 2 slept for 200 milisecond.  
    4. current thread 3 slept for 100 milisecond.  
    5. current thread 3 slept for 200 milisecond.  
    6. current thread 3 slept for 300 milisecond.  
    7. current thread 4 slept for 100 milisecond.  
    8. current thread 4 slept for 200 milisecond.  
    9. current thread 4 slept for 300 milisecond.  
    10. current thread 4 slept for 400 milisecond.  
    11. current thread 5 slept for 100 milisecond.  
    12. current thread 5 slept for 200 milisecond.  
    13. current thread 5 slept for 300 milisecond.  
    14. current thread 5 slept for 400 milisecond.  
    15. current thread 5 slept for 500 milisecond.  
    16. final result: 6  
    17. 请按任意键继续. . .  
  • 相关阅读:
    机器学习知识体系
    重新指派usb转串口模块在linux系统中的设备调用名称
    ROS 进阶学习笔记(13)
    121. 买卖股票的最佳时机
    SpringBoot | 集成Java Mail
    SpringBoot | 遇坑总结 | JPA
    测试 | 单元测试工具 | JUnit | 参数化
    测试 | 单元测试工具 | JUnit
    JSP | 基础 | 连接数据库
    Mysql | 总结 | 常用的查询语句(单表查询)
  • 原文地址:https://www.cnblogs.com/wangchuang/p/5535331.html
Copyright © 2011-2022 走看看