首页 新闻 会员 周边 捐助

async与await问题

0
悬赏园豆:5 [待解决问题]

async与await属于异步,应该比同步执行要快点,为啥我的for循环却比直接使用for快些

  public static void TestTask()
        {
           for(int i=0;i<10000;i++)
            {
                Console.Write(i);
            }
        }

  public async static void TestTask2()
        {
            await Task.Run(() =>
            {
                TestTask);
            });
        }

灬丶的主页 灬丶 | 初学一级 | 园豆:3
提问于:2018-08-13 11:20
< >
分享
所有回答(6)
0

什么意思?没明白你说的是什么

博学多思 | 园豆:76 (初学一级) | 2018-08-13 11:42

就是我写的例子的for循环比async与await效率高些,还是我哪里写错了。。

支持(0) 反对(0) 灬丶 | 园豆:3 (初学一级) | 2018-08-13 11:44

@灬丶: 奥,await不会提高效率,

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2018-08-13 11:47

@博学多思: 那这个有什么用,异步不就是为了提高效率

支持(0) 反对(0) 灬丶 | 园豆:3 (初学一级) | 2018-08-13 11:48

@灬丶: 有些场景使用异步可以提高效率,有些反而会降低效率

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2018-08-13 11:49

@博学多思: 那我那个写法是对的吗?在TestTask2()里面调用TestTask()方法

支持(0) 反对(0) 灬丶 | 园豆:3 (初学一级) | 2018-08-13 11:51

@灬丶: 很明显不对啊

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2018-08-13 12:46

@博学多思: 为啥?

支持(0) 反对(0) 灬丶 | 园豆:3 (初学一级) | 2018-08-13 14:06

@灬丶: 用的场合不对呗,你不也测试了,速度变慢了,,,这还有为啥,,,,

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2018-08-13 14:08
0

好好看看操作系统吧。

花飘水流兮 | 园豆:13617 (专家六级) | 2018-08-13 12:33

。。。。

支持(0) 反对(0) 灬丶 | 园豆:3 (初学一级) | 2018-08-13 14:06
0

首先你要清楚一个道理,

async异步的是线程不是方法,await等待的也是线程不是方法。

async/await本身是多线程的控制符,标识着当前线程与子线程中的同步关系。本身并没有提升效率的效果。

建议先了解一下C#中的Task。

 

你给的代码中,你在 TestTask2 启动了一个等待的线程,那么系统会等子线程执行结束后,再向下执行。这就和同步没什么区别了。但是多线程这个东西,CPU在多个线程间切换是需要开销的。那么自然就比单一线程执行起来要慢。

 

随便写一段,你先研究研究去

class Program
    {
        static int count = 0;
        static Stopwatch stopwatch = new Stopwatch();
        static void Main(string[] args)
        {
            stopwatch.Start();
            Console.WriteLine("Start RunAsync");
            RunAsync();
            while (count < 4) { }
            stopwatch.Stop();
            Console.WriteLine($"all finish, use time : {stopwatch.ElapsedMilliseconds} ms");

            count = 0;
            stopwatch.Restart();
            Console.WriteLine("Start Run");
            Run();
            while (count < 4) { }
            stopwatch.Stop();
            Console.WriteLine($"all finish, use time : {stopwatch.ElapsedMilliseconds} ms");
            Console.ReadKey();
        }

        static void Run()
        {
            Test("aaa");
            Test("bbb");
            Test("ccc");
            Test("ddd");
        }

        static async void RunAsync()
        {
            await Test("aaa");
            await Test("bbb");
            await Test("ccc");
            await Test("ddd");
        }

        private static async Task<int> Test(string name)
        {
            return await Task.Run(() =>
            {
                System.Threading.Thread.Sleep(1000);
                return count++;
            });

        }
    }
写代码的相声演员 | 园豆:517 (小虾三级) | 2018-08-13 14:51
0

async/await 合适处理耗时耗IO的多线程任务,async/await会从当前可用线程中找出空闲的线程来执行,让所有线程都别闲着从而提高服务的吞吐量。

你这个例子完全是不对的,TestTask如果理解为一个任务,那么TestTask2就是“开启一个空闲线程去执行TestTask任务(如果没有空闲线程会新开一个线程)”。如果TestTask耗时1s,TestTask2耗时1.2秒,那么基本可以理解成async/await 开启空闲线程/新开线程,花了0.2s。

找不到一个满意的昵称 | 园豆:243 (菜鸟二级) | 2018-08-13 14:54
0

多线程只有在高并发的情况下能提升性能,如果任务只需要一个线程去做,并且不能并行去做,同步方法当然性能更高,因为分配线程也是需要性能损耗的。

Eysa | 园豆:62 (初学一级) | 2018-08-15 17:20
0

并行跟异步不是一样的哦,了解一下并行编程

幻影gool | 园豆:257 (菜鸟二级) | 2018-08-19 18:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册