Winform异步加载数据弹窗等待效果

这篇博客介绍了如何使用C#实现异步加载数据的同时显示等待窗口,特别提到了.NET5之后BeginInvoke的弃用,并提供了两种不同的实现方法:一种是通过Action,另一种则是利用async/await。代码示例中展示了如何封装和调用这些方法,以实现带或不带返回值的异步操作。
摘要由CSDN通过智能技术生成

首先自己添加一个窗体制作一个等待窗体

我的是gif动图,赖得写代码了

我是用Action方法做的,Func做法差不多就不介绍了

还有一种方法用async/await实现

值得一说的是在.net 5版本以后BeginInvoke不能用了,所以用async/await,这里我们来简单封装。如下:

        /// <summary>
        /// 异步加载数据并且弹出等待窗体
        /// </summary>
        /// <param name="action"></param>
        protected void LoadData(Action action)
        {
            if (action == null)
                return;
            using (FmLoading fl = new FmLoading())
            {
                LoadDataAsync(action, fl);


                fl.ShowDialog();
            }
        }
        /// <summary>
        /// 异步方法
        /// </summary>
        /// <param name="action"></param>
        /// <param name="fl"></param>
        /// <returns></returns>
        private async Task LoadDataAsync(Action action, FmLoading fl)
        {
            await Task.Run(() =>
            {
                Thread.Sleep(500);
                action();
            });
            fl.Close();
        }

我们怎么调用呢?如下:

this.LoadData(() =>
            {
               
                // 加载数据
            });

当然了这样的封装有点鸡肋,不能跨线程,那么我们来封装有返回值的如下:

         protected async Task<IEnumerable<T>> LoadData<T>(Func<IEnumerable<T>> func)
        {
            if(func==null)
                return Enumerable.Empty<T>();

            IEnumerable<T> list;
            using (FmLoading fl = new FmLoading())
            {
                var tempData= ((Func<FmLoading,Task<IEnumerable<T>>>)(async (FmLoading f) =>
                {
                    var result = await Task.Run(() =>
                    {
                        Thread.Sleep(500);
                        return func();
                    });
                    f.Close();
                    return result;
                })).Invoke(fl);
                fl.ShowDialog();

                list= await tempData;
            }

            return list;
        }

如何调用?如下:

封装了一个有参有返回值的异步加载,其它自行扩展

protected IEnumerable<T> LoadData<T>(Func<object[],IEnumerable<T>> func, params object[] objects)
        {
            if (func == null)
                return Enumerable.Empty<T>();

            IEnumerable<T> list;
            using (FmLoading fl = new FmLoading())
            {
                var tempData = LoadDataAsync(func, fl, objects);
                fl.ShowDialog();

                list = tempData.Result;
            }

            return list;
        }
        private async Task<IEnumerable<T>> LoadDataAsync<T>(Func<object[],IEnumerable<T>> func, FmLoading fl, params object[] objects)
        {
            var result = await Task.Run(() =>
            {
                Thread.Sleep(500);
                return func(objects);
            });
            fl.Close();
            return result;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值