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

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习