首页 > 解决方案 > 这是使 4 个方法同时异步运行的正确方法吗?

问题描述

这是使 4 个方法同时异步运行的正确方法吗?

Version 1:
    public void startup()
    {
        var aTask = Task.Run(async () => {
            Console.WriteLine(Fetchstuff1");
            var data3 = await GetStuff1();
        });

        var bTask = Task.Run(async  () => {
            Console.WriteLine("[Fetchstuff1stuff2");
            var data1= await GetStuff2();
        });

        var cTask = Task.Run(async () => {
            Console.WriteLine(Fetchstuff1stuff3");
            var data2 = GetStuff3();
        });


        Task.WaitAll(aTask, bTask, cTask);

        // DO STUFF AFTER ALL TASK OVER IS DONE
        var categories = GetCategories();
        var dt= CreateDatable();
        Sendtodatabase();
    }


    public async Task<string> Dostuff1,2,3()
    {
        try
        {

            using (HttpResponseMessage result = await _httpClient.GetAsync(Adrdess))
            using (HttpContent content = result.Content)
            {
                result.EnsureSuccessStatusCode();
                string data = await content.ReadAsStringAsync();
            }

            return data;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error"
        }
    }

版本 2:

public async Taskstartup()
    {
        await Task.WaitAll(lol());

        // DO STUFF AFTER ALL TASK OVER IS DONE
        var categories = GetCategories();
        var dt= CreateDatable();
        Sendtodatabase();
    }

    private async Task lol() {
        await Task.Run(async () =>
        {
            Console.WriteLine(Fetchstuff1");
            var data3 = await GetStuff1();
            Console.WriteLine("[Fetchstuff1stuff2");
            var data1= await GetStuff2();
            Console.WriteLine(Fetchstuff1stuff3");
            var data2 = GetStuff3();
        });
    }

    public async Task<string> Dostuff1,2,3()
    {
        try
        {

            using (HttpResponseMessage result = await _httpClient.GetAsync(Adrdess))
            using (HttpContent content = result.Content)
            {
                result.EnsureSuccessStatusCode();
                string data = await content.ReadAsStringAsync();
            }

            return data;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error"
        }
    }

第 3 版:

  public void startup()
    {
            Console.WriteLine(Fetchstuff1");
            var task1= GetStuff1();
            Console.WriteLine("[Fetchstuff1stuff2");
            var task2 = GetStuff2();
            Console.WriteLine(Fetchstuff1stuff3");
            var task3= GetStuff3();

        Task.WhenAll(task1, task2, task3);

        List<String> data1 = await task1;
        List<String> data2 = await task2;
        List<String> data3 = await task3;
            // DO STUFF AFTER ALL TASK OVER IS DONE
            var categories = GetCategories();
            var dt= CreateDatable();
            Sendtodatabase();
        }


        public async Task<string> Dostuff1,2,3()
        {
            try
            {

                using (HttpResponseMessage result = await _httpClient.GetAsync(Adrdess))
                using (HttpContent content = result.Content)
                {
                    result.EnsureSuccessStatusCode();
                    string data = await content.ReadAsStringAsync();
                }

                return data;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error"
            }
        }

我想做的是让 a,b,c 任务同时运行,因为它们只检索一些数据。然后我希望该方法等到所有任务都返回,然后在所有任务完成后继续执行功能并执行操作。

这是正确完成还是我可以以更干净的方式完成?我应该使用异步任务启动()吗?我删除了它,因为我没有等待警告的功能。然后我希望所有最后的方法在运行时运行等待。因为就像 sendtodatabase 需要在它之前执行的方法的 dt 。

在这种情况下,我的控制台应用程序执行以下操作:Program.cs 中的 Main 调用启动方法,启动调用 datapoller 方法,datapoller 调用处理程序方法,处理程序调用 getstuff 方法。datapoller中的方法是一个事件,Timer.Elapsed += DataPollerOnElapsed; 这不能设置为异步......它位于层次结构的中间。

我该如何解决这个问题?

标签: c#asynchronous

解决方案


不需要 Task.Run ,因为您只是在包装已经返回任务的东西。

public async Task StartupAsync()
{
    Console.WriteLine("Fetchstuff1");
    var aTask = GetStuff1Async();

    Console.WriteLine("Fetchstuff1stuff2");
    var bTask = GetStuff2Async();

    Console.WriteLine("Fetchstuff1stuff3");
    var cTask = GetStuff3Async();

    await Task.WhenAll(aTask, bTask, cTask);

    // DO STUFF AFTER ALL TASK OVER IS DONE
    var categories = GetCategories();
    var dt= CreateDatable();
    Sendtodatabase();
}

推荐阅读