zoukankan      html  css  js  c++  java
  • C# 的执行顺序

    为了搞清.net的执行顺序我们做如下准备

    1,做3个任务,分别往3个文本文件写入100万行时间戳,每个任务根据计算大概需要400+毫秒。

            DateTime dt1;
    private void dowork1() { using (System.IO.StreamWriter writer = File.AppendText("newfile1.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now-dt1).Milliseconds.ToString()); } writer.Close(); } } private void dowork2() { using (System.IO.StreamWriter writer = File.AppendText("newfile2.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now - dt1).Milliseconds.ToString()); } writer.Close(); } } private void dowork3() { using (System.IO.StreamWriter writer = File.AppendText("newfile3.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now - dt1).Milliseconds.ToString()); } writer.Close(); } }

    2,采用如下方法调用者三个任务:以线程的方式调用任务1,然后调用任务2,最后调用任务3。

                dt1 = DateTime.Now;            
                Task t1 = new Task(dowork1);
                t1.Start();           
                dowork2();
                dowork3();
    

    3,最终得出第一个结果:

    查看每个任务写入文本文件的时间戳就很容易发现:

    • 任务1和任务2是同步进行的,所以时间戳是一致的。证明采用线程时,主线程和副线程是同步进行的
    • 任务3一直等待,直至任务2完成才开始。任务3的时间戳从任务2的时间戳继续。证明同一个线程里,是任务是顺序执行的。

     4,那么异步的执行顺序是如何的呢?

    我们用下面的代码当模拟一项工作,耗时5s

            private Task Worker1()
            {
                return Task.Run(()=>
                {
                    System.Threading.Thread.Sleep(5000);
                });
            }
    

      然后在winform里面把工作状态显示出来。很明显执行到这里的时候label1变成"Worker starting to work",五秒后变成"Worker done"

                label1.Text = "Worker starting to work";
                await Worker1();
                label1.Text = "Worker done";  
    

      5,最终得出第二个结果,采用async/await异步的时候是顺序执行的,好处是可以跟同步任务一样理解,又不至于引起UI卡死

  • 相关阅读:
    C#中类与结构体的区别
    计算机快捷键
    ArcSDE简单介绍
    SQLServer存储过程
    (ArcGIS Server10.0)Windows无法启动ArcGIS Server Object Manager服务(位于本地计算机上)。错误1067
    安装arcgis10.0出现localhost上运行的许可管理器版本不正确
    地理空间数据获取(二)
    地理空间数据免费获取(一)
    angular实现对百度天气api跨域请求
    angular实现跨域
  • 原文地址:https://www.cnblogs.com/franklin2018/p/9413203.html
Copyright © 2011-2022 走看看