关于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结果。


 

posted @   酒沉吟  阅读(195)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示