zoukankan      html  css  js  c++  java
  • 关于Task的认识

    首先来说说 Task.Factory.StartNew这种方式来创建Task,这里的WaitAll()指的是等待所有Task执行完成,并且里面的Task参数(t1,t2)是异步的,先以匿名委托方式

             

            static void Main(string[] args)
            {
                Task t1 = Task.Factory.StartNew(delegate { MyMethodA(); });
                Task t2 = Task.Factory.StartNew(delegate { MyMethodB(); });
                Task.WaitAll(t1, t2);
    
                Console.ReadKey();
                  
                Console.ReadKey();
            }
    
            private static void MyMethodA()
            {
                   Thread.Sleep(TimeSpan.FromSeconds(0.5));  
                Console.WriteLine("A");
            }
    
            private static void MyMethodB()
            {
                Console.WriteLine("B");
            }

          其运行结果是
         B

         A

    再看看以传参函数形式来看,并以拉姆达表达式来进行

            static void Main(string[] args)
            {
    
                Task<string> t1 = Task<string>.Factory.StartNew(()=> MyMethodA("AAAAA") );
                Task t2 = Task.Factory.StartNew(()=> MyMethodB());
                Task.WaitAll(t1, t2);
                Console.WriteLine("第二次输入" + t1.Result);
                Console.ReadKey();
                  
                Console.ReadKey();
            }
    
            private static string MyMethodA(string value)
            {
                Thread.Sleep(TimeSpan.FromSeconds(0.5));  
                Console.WriteLine(value);
                return value;
            }
    
            private static void MyMethodB()
            {
                Console.WriteLine("B");
            }

    因MyMethodA()里面将task线程挂起了,所以先输出了B,也证明了Task的异步!

    使用New Task创建TASK

    、最简单的构造Task的方式为使用lambda表达式:

    1. Task<int> task = new Task<int>(() => TaskMethod("Task 1"));  
    2. task.Start();  
    3. int result = task.Result;  
    4. Console.WriteLine("Result is: {0}", result);  
    Task<int> task = new Task<int>(() => TaskMethod("Task 1"));
    task.Start();
    int result = task.Result;
    Console.WriteLine("Result is: {0}", result);

    需要注意的是,我们构造了Task<int>任务,然后Start(),之后返回值即task.Result属性!由于Result的关系,因此线程将等待result得到后再往下进行。

    二、Task同步运行RunSynchronously

    1. Task<int>  task = CreateTask("Task 2");  
    2. task.RunSynchronously(); //运行在主线程中,等同于直接运行: TaskMethod("Task 2");  
    3. int result = task.Result;  
    4. Console.WriteLine("Result is: {0}", result);  
    Task<int>  task = CreateTask("Task 2");
    task.RunSynchronously(); //运行在主线程中,等同于直接运行: TaskMethod("Task 2");
    int result = task.Result;
    Console.WriteLine("Result is: {0}", result);

    这里没有使用Start()而是使用RunSynchronously(),直接同步运行!等同于直接运行 Result = TaskMethod("Task 2");

    因此,该Task不是运行在线程池中,而是运行在主线程中。

    三、Task的运行状态

    1. Task<int> task = CreateTask("Task 3");  
    2. Console.WriteLine(task.Status);  
    3. task.Start();  
    4. while (!task.IsCompleted)  
    5. {  
    6. Console.WriteLine(task.Status);  
    7. Thread.Sleep(TimeSpan.FromSeconds(0.5));  
    8. }  
    9. Console.WriteLine(task.Status);  
    10. int result = task.Result;  
    11. Console.WriteLine("Result is: {0}", result);  
    Task<int> task = CreateTask("Task 3");
    Console.WriteLine(task.Status);
    task.Start();
    while (!task.IsCompleted)
    {
    Console.WriteLine(task.Status);
    Thread.Sleep(TimeSpan.FromSeconds(0.5));
    }
    Console.WriteLine(task.Status);
    int result = task.Result;
    Console.WriteLine("Result is: {0}", result);

    上面的代码使用了状态判断(IsCompleted)轮查方式,输出了不同的Task状态。等到task执行完毕后,也就自然得到int结果。


  • 相关阅读:
    #include 和 #pragma comment 的相对路径起点
    linux学习之——phpMyadmin配置
    linux学习之——LAMP配置
    python学习之——文件过滤,不显示文件中以‘#’开头的行
    python学习之——元组中两数相加之和等于某数
    python学习之——识别标识符&关键字
    python学习之——single number
    python学习之——Add Digits
    python学习之——猜大小
    python学习之——冒泡排序
  • 原文地址:https://www.cnblogs.com/yingger/p/6741487.html
Copyright © 2011-2022 走看看