微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个简单的例子看明白 async await Task

测试代码

  1 using System;
  2  System.Collections.Generic;
  3  System.ComponentModel;
  4  System.Data;
  5  System.Drawing;
  6  System.Linq;
  7  System.Text;
  8  System.Threading;
  9  System.Threading.Tasks;
 10  System.Windows.Forms;
 11  Utils;
 12 
 13 namespace test
 14 {
 15     public partial class Form1 : Form
 16     {
 17         public Form1()
 18         {
 19             InitializeComponent();
 20         }
 21 
 22         private void Form1_Load(object sender,EventArgs e)
 23  24 
 25  26 
 27         /// <summary>
 28         /// 执行任务
 29         </summary>
 30         string DoWork(string str)
 31  32             Thread.Sleep(3000); //模拟延迟 比如网络请求 用了3000毫秒
 33             return "输出" + str;
 34  35 
 36          37          38          39         public Task<string> DoWorkByTask( 40  41             return Task.Run(() =>
 42             {
 43                 Thread.Sleep( 44                  45             });
 46  47 
 48          49          测试1
 50          51         async void button1_Click( 52  53             LogTimeUtil logTime = new LogTimeUtil();
 54 
 55             var t1 = DoWorkByTask(测试值1");
 56 
 57             var t2 = DoWorkByTask(测试值2 58 
 59             string r1 = await t1;
 60 
 61             textBox1.AppendText(r1 + \r\n 62 
 63             string r2 =  t2;
 64 
 65             textBox1.AppendText(r2 +  66 
 67             logTime.LogTime(耗时,textBox1);
 68  69 
 70          71          测试2 
 72         /// 
 73          等效于 测试1
 74          75         void button2_Click( 76  77             Task.Run(() => 如果不加Task.Run,界面会卡
 78  79                 LogTimeUtil logTime =  80 
 81                 Task<string> t1 = Task.Run<string>(() => { return DoWork(); });
 82                 Task<string> t2 = Task.Run< 83 
 84                 Task.WaitAll(t1,t2);
 85 
 86                 this.Invoke(new Action(() => 线程中修改控件数据要使用Invoke
 87                 {
 88                     textBox1.AppendText(t1.Result +  89                     textBox1.AppendText(t2.Result +  90                 }));
 91 
 92                 logTime.LogTime( 93  94  95 
 96          97          测试3 
 98          99         void button3_Click(100 101             LogTimeUtil logTime = 102 
103             var r1 = await DoWorkByTask(104 
105             textBox1.AppendText(r1 + 106 
107             var r2 = 108 
109             textBox1.AppendText(r2 + 110 
111             logTime.LogTime(112 113 
114         115          测试4
116         117          等效于 测试3
118         119         void button4_Click(120 121             Task.Run(() => 122 123                 LogTimeUtil logTime = 124 
125                 Task<126                 t1.Wait();
127                 128 129                     textBox1.AppendText(t1.Result + 130 131 
132                 Task<133                 t2.Wait();
134                 135 136                     textBox1.AppendText(t2.Result + 137 138 
139                 logTime.LogTime(140 141 142 
143     }
144 }
View Code

测试输出

附 LogTimeUtil.cs:

 System.Windows.Forms;

 Utils
{
    <summary>
     记录耗时
    </summary>
     LogTimeUtil
    {
        private DateTime _lastTime;

         LogTimeUtil()
        {
            _lastTime = DateTime.Now;
        }

        <summary>
         记录耗时
        </summary>
        void LogTime( msg)
        {
            double d = DateTime.Now.Subtract(_lastTime).TotalSeconds;
            LogUtil.Log(msg + ,耗时:" + d.ToString(0.000") + );
        }

         msg,TextBox txt)
        {
             DateTime.Now.Subtract(_lastTime).TotalSeconds;
            msg = msg +  秒\r\n;
            if (txt.Invokerequired)
            {
                txt.Invoke(new Action(() =>
                {
                    txt.AppendText(msg);
                }));
            }
            else
            {
                txt.AppendText(msg);
            }
        }
    }
}
View Code

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐