action不能await

class Program
{
    static int i = 0;

    static async Task Main(string[] args)
    {
        for (int i = 0; i < 3; i++)
        {
            await RunInNewScopeAsync(async () =>
            {
                var n1 = await DoWorkAsync();
                Console.WriteLine(n1);
            });
        }

        Console.WriteLine("finished...");
        Console.ReadLine();
    }

    static Task RunInNewScopeAsync(Action action)
    {
        action();
        return Task.CompletedTask;
    }

    static async Task<string> DoWorkAsync()
    {
        await Task.Delay(1000);
        return "mxd " + i++;
    }
}

  

 今天审查一处代码(

 

1756198860916_54026F03-019B-4733-93D2-21421A86A93C

 

1756199081424_FDA312B8-C817-41dc-A8E4-0A32DA8759F9

 

 

完整实例:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static int i = 0;
    // 异步方法:模拟一个需要等待的操作
    static async Task<string> DoWorkAsync()
    {
        // 使用 Task.Delay 进行异步等待 - ✅ 推荐
        await Task.Delay(1000); // 等待3秒,期间线程可以去处理其他任务

        return "mxd " + i++;
    }


    static void RunInNewScope(Action action)
    {
        action();
    }

    static  Task RunInNewScopeAsync(Action action)
    {
        action();
        return Task.CompletedTask;
    }

    static T RunInNewScopeFunc<T>(Func<T> func)
    {
        return func();
    }

    // 主方法必须是 async 才能使用 await
    static async Task Main(string[] args)
    {
        //for (int i = 0; i < 100; i++)
        //{
        //    // 调用异步方法并等待其完成
        //    var n1 = await DoWorkAsync();
        //    Console.WriteLine(n1);
        //}

        for (int i = 0; i < 3; i++)
        {
            await RunInNewScopeAsync(async () =>
            {
                var n1 = await DoWorkAsync();
                Console.WriteLine(n1);
            });
        }


        //for (int i = 0; i < 3; i++)
        //{
        //    await RunInNewScopeFunc(async () =>
        //     {
        //         var n1 = await DoWorkAsync();
        //         Console.WriteLine(n1);
        //         return n1;
        //     });
        //}

        Console.WriteLine("finished...");

        Console.ReadLine();

    }
}

  

 

遍历场次,切换数据库执行逻辑,,截图是简单示例),发现action的缺点;综合对比,后续建议都用func.

 

 

其他示例:

class Program
{
    static int i = 0;

    static async Task Main(string[] args)
    {
        for (int i = 0; i < 3; i++)
        {
            await RunInNewScopeAsync(async () =>
            {
                var n1 = await DoWorkAsync();
                Console.WriteLine(n1);
            });
        }

        Console.WriteLine("finished...");
        Console.ReadLine();
    }

    static async Task RunInNewScopeAsync(Action action)
    {
        action();
    }

    static async Task<string> DoWorkAsync()
    {
        await Task.Delay(1000);
        return "mxd " + i++;
    }
}

  

posted @ 2025-08-26 17:17  China Soft  阅读(11)  评论(0)    收藏  举报