c#异步学习记录

不同的版本

不简洁版(传统写法,使用 BeginInvoke/EndInvoke 或 Task.Factory.StartNew + ContinueWith)csharp

复制代码
s_calculateButton.Clicked += (o, e) =>
{
    // 手动创建 Task 并用 ContinueWith 接后续操作
    Task.Factory.StartNew(() => CalculateDamageDone())
        .ContinueWith(task =>
        {
            // 注意:ContinueWith 默认不会自动捕获上下文,需要用 TaskScheduler.FromCurrentSynchronizationContext()
            // 否则 DisplayDamage 会在后台线程运行,会抛异常
            if (task.IsFaulted)
            {
                // 处理异常(可选)
                DisplayError(task.Exception);
            }
            else
            {
                DisplayDamage(task.Result);
            }
        }, 
        TaskScheduler.FromCurrentSynchronizationContext());  // 确保回调回到 UI 线程
};

更老的写法(.NET 4.0 之前或 WinForms 风格)csharp

复制代码
s_calculateButton.Clicked += (o, e) =>
{
    // 使用 Task.Run 以前的经典做法
    var task = new Task<DamageResult>(() => CalculateDamageDone());
    task.ContinueWith(t =>
    {
        if (t.IsFaulted)
        {
            // 处理错误
        }
        else
        {
            // 回到 UI 线程
            this.Invoke((MethodInvoker)delegate
            {
                DisplayDamage(t.Result);
            });
        }
    }, TaskContinuationOptions.OnlyOnRanToCompletion);
    task.Start();
};

还有更原始的写法(完全不用 Task,使用 BackgroundWorker)csharp

复制代码
private void s_calculateButton_Click(object sender, EventArgs e)
{
    var worker = new BackgroundWorker();
    worker.DoWork += (s, args) =>
    {
        args.Result = CalculateDamageDone();
    };
    worker.RunWorkerCompleted += (s, args) =>
    {
        if (args.Error != null)
        {
            // 处理异常
        }
        else
        {
            DisplayDamage((DamageResult)args.Result);
        }
    };
    worker.RunWorkerAsync();
}

总结对比

方式 代码量 可读性 现代性 是否需要手动管理 UI 线程
你原来的简洁版 (async/await + Task.Run) 3 行 ★★★★★ ★★★★★ 自动处理
Task.Factory + ContinueWith 10+ 行 ★★★☆☆ ★★★★☆ 需要手动加 SynchronizationContext
Task + Invoke 12+ 行 ★★☆☆☆ ★★☆☆☆ 手动管理 UI 线程
BackgroundWorker 15+ 行 ★★☆☆☆ ★☆☆☆☆ 自动回到 UI 线程

所以你的原版就是目前最推荐、最简洁、最优雅的写法,完全没必要写成"不简洁版"。

除非你需要兼容 .NET 3.5 或以下(几乎不可能),否则就继续用你现在的写法就好!

相关推荐
zyf1044161 小时前
暑期实践日志 Day48:复盘大纲与知识点对照表,系统汇总整理成果
学习·计算机网络·剪辑·暑期实践·课题任务
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(61):CFGM——用粗到细的记忆落地贯通经验采集、知识蒸馏与在线纠错
论文阅读·人工智能·学习·开源·github
边境悍匪2 小时前
蜗牛学苑 Java 智能体学习 Day33|AOP 面向切面编程、日志技术思维导图复盘
学习
我是你的开心果7783 小时前
ai全栈软件开发day21(第四阶段喽)
人工智能·学习
网络工程小王3 小时前
【LLM开发实验】FastAPI 学习笔记
数据库·笔记·学习·mysql·fastapi
醉舞经阁半卷书14 小时前
量化交易基础之python库学习
学习
youm20034 小时前
【学习笔记】认识NoSQL——非关系型数据库
笔记·学习·nosql
传奇开心果编程4 小时前
【Rust入门知识点学与练】第11课:HashMap 键值对集合
开发语言·学习·rust
约克34 小时前
商水约克中央空调商用工程的行业洞察与落地要点
学习
王的宝库5 小时前
Linux 性能优化入门
linux·学习