当前位置: 首页 > news >正文

C# task任务异步编程提高UI的响应性

方式1:async/await模式


        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var result = await Task.Run(() => CalculateResult());
                label1.Text = result.ToString();
            }
            catch (Exception ex)
            {
                label1.Text = $"Error: {ex.Message}";
            }
        }

        private int CalculateResult()
        {
            System.Threading.Thread.Sleep(3000);  // 模拟耗时计算
            Random r = new Random();
            int a = r.Next(1, 100);
            int b = r.Next(1, 100);
            return a + b;
        }

方式2:回调注册模式

        private void button1_Click(object sender, EventArgs e)
        {
            var ts = RunAsyncTask();
            RegisterCallback(ts, label1);
        }

        private  Task<int> RunAsyncTask()
        {
            return Task.Run(() =>
            {
                System.Threading.Thread.Sleep(3000);  // 模拟耗时计算
                Random r = new Random();
                int a = r.Next(1, 100);
                int b = r.Next(1, 100);
                return a + b;
            });
        }

        private  void RegisterCallback(Task<int> task,Label label)
        {
            task.GetAwaiter().OnCompleted(() =>
            {
                label.Invoke((MethodInvoker)delegate
                {
                    label.Text = $"result: {task.Result}";
                });
            });
        }

简化写法(方式2):


        private void button1_Click(object sender, EventArgs e)
        {
            RunAsyncTask()
                .ContinueWith(t =>
                {
                    label1.Invoke(new Action(() =>
                    {
                        label1.Text = t.IsFaulted ?
                            $"Error: {t.Exception?.InnerException?.Message}" :
                            $"Result: {t.Result}";
                    }));
                }, TaskScheduler.Default);

        }
        private  Task<int> RunAsyncTask()
        {
            return Task.Run(() =>
            {
                System.Threading.Thread.Sleep(3000);  // 模拟耗时计算
                Random r = new Random();
                int a = r.Next(1, 100);
                int b = r.Next(1, 100);
                return a + b;
            });
        }

二、核心机制分析

1. 共同点

  • 都使用Task.Run将耗时操作放到线程池执行

  • 都能保持UI线程的响应性

  • 最终都能正确更新UI控件

2. 关键差异

特性async/await模式回调注册模式
代码结构线性流程,更易读分散式,逻辑分离
线程上下文恢复自动恢复UI上下文需手动Invoke回UI线程
异常处理可直接用try-catch需在回调中处理异常
可扩展性相对固定更灵活,可自定义回调逻辑
适用场景简单异步操作需要自定义完成逻辑的复杂场景
代码维护性高,逻辑集中较低,逻辑分散
调试难度较低,有完整的调用栈较高,调试异步回调较复杂

三、性能与资源比较

  1. 内存分配

    • async/await会生成状态机,有额外分配

    • 回调模式更直接,分配更少

  2. 执行效率

    • 实际计算性能几乎无差别

    • 回调模式在极高并发下可能略有优势

  3. 线程使用

    • 两种方式都正确使用线程池

    • 无实质性差异

四、最佳实践建议

优先使用async/await模式的情况:

  • 简单的异步操作

  • 需要清晰的代码流程

  • 需要直接处理异常

  • 团队对async/await更熟悉时

考虑使用回调模式的情况:

  • 需要自定义任务完成后的处理逻辑

  • 需要更精细控制任务生命周期

  • 在性能敏感的极高并发场景

  • 需要复用相同的回调逻辑时

 

 

 

相关文章:

  • 【C++游戏引擎开发】第13篇:光照模型与Phong基础实现
  • Android Input——分发流程回调(八)
  • Ubuntu下文本文件处理
  • 个人博客项目(全栈项目)
  • UE5学习笔记 FPS游戏制作43 UI材质
  • 新手小白使用conda第一集
  • SSM摄影器材租赁系统
  • 离线安装 nvidia-docker2(nvidia-container-toolkit)
  • 制作前的关键筹备:考试考核系统之核心要点
  • 高安全等级车规芯片在星载控制终端上的应用
  • ruby内置全局变量
  • [硬件]单片机下载电路讲解-以ch340为例
  • Docker:安装与部署 Nacos 的技术指南
  • vscode 异常关闭后无法远程连接服务器
  • 大模型——Llama 4 系列登场 原生多模态 AI 创新的新起点
  • 阿里funASR在Ubuntu22环境部署启动步骤
  • HTTPS工作原理是什么?它是如何实现数据加密的?
  • 搭建Trae+Vue3的AI开发环境
  • Inverse Reinforcement Learning with Natural Language Goals论文阅读
  • 隐藏源站IP与SD-WAN回源优化:高防架构的核心实践
  • 如何建立游戏网站/在百度做广告多少钱
  • 利于seo的网站设计/新手做销售怎么开发客户
  • 常德政务网站/竞价推广哪家公司好
  • 建盏公司最新消息/seo快速排名软件价格
  • 网站制作团队分工/搜资源
  • 网站建设花都區/合作seo公司