zoukankan      html  css  js  c++  java
  • C# Task.Run 和 Task.Factory.StartNew 区别

    一,问题

    最近有水友提了个问题。

    Task task = Task.Factory.StartNew(async () =>
         {
          while (true)
          {
               await Task.Delay( 1000);
          }
        }
     
      Task.WaitAll(new Task[] { task });
     
    结果运行到await Task.Delay( 1000);直接跳出了while,导致 Task.WaitAll完成了,这是怎么回事,
     await Task.Delay( 1000);  改成Thread.Sleep(1000)就正常了

    二,解答

    sp1234回答了,

    果真,听君一席话,胜读十年书!

    三,测试

    static void Main(string[] args)
            {
                test();
                Console.WriteLine("按任意键结束........");
                Console.ReadKey();
            }
     
            private static async void test()
            {
                var task = Task.Run(async () =>
                {
                    while (true)
                    {
                        await Task.Delay(1000);
                        Console.Write(".");
                    }
                });
                await Task.WhenAll(task);
                Console.WriteLine("完成");
            }
     
            private static async void test1()
            {
                var task = Task.Factory.StartNew(async () =>
                {
                    while (true)
                    {
                        await Task.Delay(1000);
                        Console.Write(".");
                    }
                });
                await Task.WhenAll(task);
                Console.WriteLine("完成");
            }

    Task.Run

    Task.StartNew

    四,探究

    MSDN其实也有提到,但藏在文档里很容易被忽略。

    我们先看一下:msdn说的

    ①,我们先把内部委托的async 去掉。

    看一下返回类型。

    Task.Run

    Task.Factory.StartNew

    ②,我们在看看async action()

    Task.Run

    Task.Factory.StartNew

    五,总结

    1,调用Unwrap()方法,Task.Factory.StartNew(async action()).Unwrap() 可以实现和Task.Run(async action())  一样的功能。

    2,推荐大家看一下这篇博客,很详细:https://www.cnblogs.com/qinjin/p/Task-Run-Vs-Task-Factory-StartNew.html

  • 相关阅读:
    jenkins配置html报告
    JMeter并发测试(设置集合点)
    jmeter压力测试 设置一秒发送一次请求,一秒两次请求
    jmeter压力测试的简单实例+badboy脚本录制
    JMeter问题集
    英语自然拼读法基本规则和小窍门
    Jmeter工具做性能测试 常见的错误汇总
    如何使用JDK自带工具JConsole
    第七章 JMeter 逻辑控制器
    第六篇:JMeter 断言
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/14654791.html
Copyright © 2011-2022 走看看