async+await 让界面飞,让双手爽

.net 4.5已经发布很久了,但是一直也没有静下心来好好的研究微软给开发者带来的喜悦。

今天我将简单的介绍下 async + await 这对搭档的出现,如何让频繁假死的界面飞起来(其实只是不再阻塞UI线程而已,标题党一下)

 

建议大家先了解下 IAsyncReuslt ,做过异步的应该都知道它怎么用吧?用过socket的人也几乎对它了如指掌了,不知道的谷歌一下吧,我就不贴上来了。

 

  • async + await 让界面飞

   园子里“滴答的雨”已经详细解释过了,我这里只贴一个例子以便跟我写的方式进行对比。

   其中 for 循环是为了增加网络延迟,模拟一定的加载时间而已,网速好的同学可以自行放宽。

  

        private async void button1_Click(object sender, EventArgs e)
        {
            string s = await Test();
            MessageBox.Show(s);
        }

        private async Task<string> Test()
        {
            string str = null;

            for (int i = 0; i < 10; i++)
            {
                using (WebClient wc = new WebClient())
                {
                    str = await wc.DownloadStringTaskAsync("http://www.baidu.com");
                }
            }

            return str;
        }
  • 让双手爽,让代码简洁,让假死瞬间复活

   现在我想让我的代码变成这个样子,尽量少的改动之前的函数,同时新写的方法也不需要考虑返回Task<T>

其实区别在于两点:

    1. await new FastAsync<string>().TaskAsync();

    2.TestAsync 函数本身没有引用到 async 或者 await ,也就是说逻辑函数相比较之前的版本来说没有做出改动。

        private async void button1_Click(object sender, EventArgs e)
        {
            string s = await new FastAsync<string>().TaskAsync(TestAsync);
            MessageBox.Show(s);
        }

        private string TestAsync()
        {
            string str = null;

            for (int i = 0; i < 10; i++)
            {
                using (WebClient wc = new WebClient())
                {
                    str = wc.DownloadString("http://www.baidu.com");
                }
            }

            return str;
        }
  • 改造async + await的使用方式,提供快速操作函数

   通过上面的代码应该已经发现问题了,就是 FastAsync<string> 是哪里来的呢?这就是今天要说的重点了。代码量不多,只没特别的技术含量只是需要动下脑而已。

  

    public class FastAsync<T>
    {
        TaskCompletionSource<T> m_tcs;

        public Task<T> TaskAsync(Func<T> func)
        {
            m_tcs = new TaskCompletionSource<T>();
            IAsyncResult result = func.BeginInvoke(new AsyncCallback(AsyncResult), func);

            return m_tcs.Task;
        }

        private void AsyncResult(IAsyncResult result)
        {
            Func<T> func = result.AsyncState as Func<T>;
            T entity = func.EndInvoke(result);
            m_tcs.SetResult(entity);
        }
    }

 

   是不是很简单?

   或许大家有更好的方法,欢迎交流,本文的实现方式只是我一时兴起想出来的,目的也很简单,就是想简化代码。

   当然,这也未必是最简单的实现方式,在这里我只能说我提供的是一个思路,一个简化版实现方式而已,真实项目中还要继续改进和扩展。如果您喜欢,麻烦点个赞?哈哈^_^

转载于:https://www.cnblogs.com/doddgu/p/3697175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
async/await是一种异步编程的方式,它可以让我们更方便地编写异步代码,避免了回调地狱的问题。async/await是ES2017引入的新特性,它基于Promise实现。 async函数是一个返回Promise对象的函数,可以使用await关键字来等待Promise对象的状态变化。当我们在async函数中使用await关键字等待一个Promise对象时,代码会暂停执行,直到Promise对象的状态变为resolved或rejected。如果Promise对象的状态变为resolved,await表达式会返回Promise对象的resolve值;如果Promise对象的状态变为rejected,await表达式会抛出Promise对象的reject值。 async/await的优点在于它可以让异步代码看起来像同步代码,使得代码更易读、易懂。同时,它也可以避免回调地狱的问题,使得代码结构更加清晰。 下面是一个使用async/await的例子: ``` async function fetchData() { try { const response = await fetch('https://api.example.com/data'); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } } ``` 在上面的例子中,fetchData函数是一个async函数,它使用了await关键字等待fetch函数返回的Promise对象。如果fetch函数返回的Promise对象状态变为resolved,fetchData函数会继续执行,并使用await关键字等待response.json()方法返回的Promise对象。如果response.json()方法返回的Promise对象状态变为resolved,fetchData函数会继续执行,并将解析后的数据打印到控制台上。如果任何一个Promise对象的状态变为rejected,fetchData函数会抛出错误并打印到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值