Skip to content

.Net 4.5 中的Task简单异步

有一个多月没写过代码了,也没有研究过什么东西。整天跟小朋友混在一起,乐不思码!

有句俗话说生过孩子的妈:生完傻3年。我觉得对孩子的爸也适用。

 

这两年跟许多做技术的项目/产品经理聊过不少,发现,别人都是很系统的拼接,攒上了“汽车”,至少也“电动”了,我还在一点点码代码,闭门造自行车。虽说有好有坏处,但在这种速生年代绝不算是工匠精神,只能说挺落伍。

 

4.5出很久了,但也没研究过,用.Net作一般的东西,论技术实现其实2.0就够了。新版本更多是对以往版本的更高级封装,更简便的实现,无非牺牲一些执行效率,来提升开发效率,这也是我们为什么机器会越来越卡的原因。

听说异步是4.5的一大优点,想想以前写Winform的UI卡顿,要写后台线程去处理,十分的麻烦。

写了个简单实例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public struct awaitBack
        {
            public double ts;
            public int value;
        }

        string[] urls = {
            "http://alibaba.com",
            "http://bohu.net",
            "http://china.com",
            "http://debug.ml",
            "http://g00gle.eu",
            "http://taobao.com"
        };

        int count = 1;
        int max = 5;
        StringBuilder sbresults = new StringBuilder();

        private async void button1_Click(object sender, EventArgs e)
        {
            count = 1;
            sbresults.Clear();
            resultsTextBox.Text = "";
            while (count <= max)
            {
                awaitBack ab = await AccessTheWebAsync(); 
                sbresults.Append(count + "[await "+(ab.ts).ToString()+" ms]" + (ab.value).ToString() + "\r\n\r\n");
                resultsTextBox.Text = sbresults.ToString();
                count++;
            }
            //resultsTextBox.Text = sbresults.ToString();
        }

        async Task<awaitBack> AccessTheWebAsync()
        {
            DateTime start = DateTime.Now;
            TimeSpan ts = new TimeSpan();

            HttpClient client = new HttpClient();
            //string www = RndUrl();
            string www = urls[count];
            Task<string> getStringTask = client.GetStringAsync(www);

            DoYouWork(www);
            
            string urlContents = await getStringTask;
            ts = DateTime.Now - start;
            awaitBack ab;
            ab.ts = ts.TotalSeconds;
            ab.value = urlContents.Length;
            return ab;
        }

        string RndUrl()
        {
            Random ran = new Random();
            int RandKey = ran.Next(1, 5);
            return urls[RandKey];
        }

        void DoYouWork(string www)
        {
            sbresults.Append(count + "[Working:"+ www + "]\r\n");       
        }
    }
}

花了2个来小时,大致用下,优点是对于简单的需求后台耗时处理,这种async Task 可以让UI上体验会很好, 使用也很简单。

只是感觉它是过于简单,似乎是的把BackgroundWorker封装了一下, 要是把线程间通信那些,线程池,回调,委托都简化集合那才是极好。
暂时疑问是:
1,为什么不增加Callback回调的方法呢?还要像以前BeginInvoke和EndInvoke自己写委托代理吧。
2,还有报错时异步方法中无法扑捉异常?
(回头再看看把)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

一点简单的验证. 谢谢 *验证时间已超时。请刷新验证码。