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 或以下(几乎不可能),否则就继续用你现在的写法就好!

相关推荐
hhcccchh2 分钟前
学习vue第十一天 Vue3组件化开发指南:搭积木的艺术
前端·vue.js·学习
week_泽2 分钟前
第9课:LangMem SDK高效实现长期记忆管理 - 学习笔记_9
人工智能·笔记·学习·ai agent
笔夏8 分钟前
【安卓学习之webRTC】学习相关资料
android·学习·webrtc
li星野12 分钟前
OpenCV4X学习- cv::Mat
学习
有为少年12 分钟前
PyTorch 的统计三剑客:bucketize, bincount 与 histogram
pytorch·python·学习·机器学习·统计
王解24 分钟前
CTF学习
学习
AI视觉网奇27 分钟前
PlayerStreaming 驱动audio2face 学习笔记
笔记·学习·ue5
承渊政道30 分钟前
Linux系统学习【Linux基础指令以及权限问题】
linux·服务器·学习
Engineer邓祥浩34 分钟前
设计模式学习(11) 23-9 组合模式
学习·设计模式·组合模式
专注于大数据技术栈35 分钟前
java学习--什么是线程安全和不安全
java·学习·安全