首页 新闻 会员 周边 捐助

我想把现有的c#代码同步方法都改成异步方法,请问应该怎么操作

0
悬赏园豆:50 [已解决问题] 解决于 2021-07-14 11:13

我现在的同步代码是这样的:

class Program
    {
        static void Main(string[] args)
        {
            Test("A");
        }
        static void Test(string str)
        {

            switch (str)
            {
                case "A":
                    TestA();
                    break;
                case "B":
                    TestB();
                    break;
                default:
                    break;
            }
        }
        static void TestA()
        {
            //处理xx问题
            Console.WriteLine("TestA处理完毕");
        }
        static void TestB()
        {
            //处理xx问题
            Console.WriteLine("TestB处理完毕");
        }
    }

我想把TestA和TestB变成异步方法 Test方法是否需要也启动一个Task 比如这样:

 class Program
    {
        static async Task Main(string[] args)
        {
            await Test("A");
        }
        static async Task Test(string str)
        {
            await Task.Run(() =>
            {
                switch (str)
                {
                    case "A":
                        _ = TestA();
                        break;
                    case "B":
                        _ = TestB();
                        break;
                    default:
                        break;
                }
            });

        }
        static async Task TestA()
        {
            await Task.Run(() =>
            {
                //处理xx问题
                Console.WriteLine("TestA处理完毕");
            });
        }
        static async Task TestB()
        {
            await Task.Run(() =>
            {
                //处理xx问题
                Console.WriteLine("TestB处理完毕");
            });
        }
    }

TestA和TestB相当于一个后台任务,成功和失败我都不需要去管,有必要把Test方法也启动一个Task吗,记得异步就是要异步到底,只要有一个方法用async修饰了,那么所有与这个方法有关的方法都需要用async修饰,那我这种情况,给Test启动了一个Task是对的吗,有没有什么性能损失呢,还是直接这么调:

static void Test(string str)
{
    switch (str)
    {
        case "A":
            _ = TestA();
            break;
        case "B":
            _ = TestB();
            break;
        default:
            break;
    }
}

或者:

        static async Task Test(string str)
        {
            switch (str)
            {
                case "A":
                    await TestA();
                    break;
                case "B":
                    await TestB();
                    break;
                default:
                    break;
            }
        }
咬轮猫的主页 咬轮猫 | 初学一级 | 园豆:159
提问于:2020-11-09 15:50

是不是Test方法里面有别的耗时操作就用Task Run,否则就用最后一种

咬轮猫 4年前
< >
分享
最佳答案
0

你 Task.Run(()=>switch)的时候 已经用另一个线程去异步执行switch里的代码了 Task&B不用再去Task.Run了 凡是调用了含异步代码的函数 都可以标注为async

收获园豆:50
彭小立 | 小虾三级 |园豆:634 | 2020-11-09 16:00

如果Test方法里面在switch前面有别的耗时操作,这个耗时操作和TestA还有TestB互不影响,可以同步运行是不是就需要
Task.Run(()=>
//执行耗时操作
switch
)
然后TestA还有TestB也需要Task.Run

咬轮猫 | 园豆:159 (初学一级) | 2020-11-09 16:04

@咬轮猫: 可以的 但是别在task.run前加await

彭小立 | 园豆:634 (小虾三级) | 2020-11-09 16:07

@彭小立: 请问是哪个方法不加await呢 Test还是TestA B呢 不加的话 编译器会提示警告啊 要把async也去掉吗

咬轮猫 | 园豆:159 (初学一级) | 2020-11-09 16:11

@咬轮猫: 加await会等待Task执行完之后才会向下执行 一般都是为了同步执行防止主线程阻塞
不过看你的需求 应该是为了开启后台线程吧 那可以用 ThreadLocal 你可以google一下这个的用法
我用的也不多 别误导你了

彭小立 | 园豆:634 (小虾三级) | 2020-11-09 16:22

@彭小立: 我先研究一下 谢谢您

咬轮猫 | 园豆:159 (初学一级) | 2020-11-09 16:22
其他回答(1)
0

异步不会加快处理速度,提升的是线程利用率,如果一个方法,由同步改为异步,该多快还是多快,只是吞吐率提升了

不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2020-11-09 17:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册