簡體   English   中英

任務WaitAll返回列表c#中的object

[英]Task WaitAll return List object in c#

我創建了這段代碼來了解 c# 中的“Task.WaitAll ()”。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;

namespace taskApp
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Task> p = new List<Task>();

            Task task1 = MultipleTasks();
            Task task2 = Hello(40);
            Task task3 = Bye(10);
            Task.WaitAll(task1, task2, task3);

            var a = 1;
            a = a + 1;
        }

        private static async Task Hello(int delay)
        {
            await Task.Delay(delay);
            Console.WriteLine($"+++ End Process: {nameof(Hello)}, delay: {delay} +++ ");
        }

        private static async Task Bye(int delay)
        {
            await Task.Delay(delay);
            Console.WriteLine($"+++ End Process: {nameof(Bye)}, delay: {delay} +++ ");
        }
        private static async Task<List<MyClass>> MultipleTasks()
        {
            List<Task<MyClass>> psTask = new List<Task<MyClass>>();
            List<MyClass> ps = new List<MyClass>();

            for (int i = 0; i < 3; i++)
                psTask.Add(getTest(i));

            Task.WaitAll(psTask.ToArray());

            ps = psTask.Select(c => c.Result).ToList();

            return ps;
        }

        private static async Task<MyClass> getTest(int i)
        {
            MyClass p = new MyClass();
            int delay = 0;
            switch (i)
            {
                case 0:
                    delay = 4000;
                    p.delayUsed = delay;
                    p.message = "cero";
                    break;
                case 1:
                    delay = 1000;
                    p.delayUsed = delay;
                    p.message = "uno";
                    break;
                case 2:
                    delay = 7000;
                    p.delayUsed = delay;
                    p.message = "dos";
                    break;
                case 3:
                    delay = 2000;
                    p.delayUsed = delay;
                    p.message = "tres";
                    break;
                default:
                    p.message = "default";
                    break;
            }

            await Task.Delay(p.delayUsed);
            Console.WriteLine($"+++ End Process: {nameof(getTest)} {i}, delay: {delay} +++ ");
            return p;
        }
    }

    public class MyClass
    {
        public int delayUsed { get; set; }
        public string message { get; set; }
    }
}

這是控制台應用程序運行的順序

+++ End Process: getTest 1, delay: 1000 +++
+++ End Process: getTest 0, delay: 4000 +++
+++ End Process: getTest 2, delay: 7000 +++
+++ End Process: Bye, delay: 10 +++
+++ End Process: Hello, delay: 40 +++

我的應用程序應該運行的正確順序如下:

+++ End Process: Bye, delay: 10 +++
+++ End Process: Hello, delay: 40 +++
+++ End Process: getTest 1, delay: 1000 +++
+++ End Process: getTest 0, delay: 4000 +++
+++ End Process: getTest 2, delay: 7000 +++

遵循各方法延遲時間的邏輯,推導出正確的執行順序

在此處輸入圖像描述

這就是“visual studio 2019”給我的幫助。

並且有效地同步執行“MultipleTasks()”方法。

有人可以告訴我如何使控制台應用程序正常運行嗎?

問題是您在創建任務期間正在等待,而不僅僅是它們的執行。

首先,將MultipleTasks()方法更改為如下所示(返回List<Task> ):

    private static List<Task> MultipleTasks()
    {
        List<Task> psTask = new List<Task>();

        for (int i = 0; i < 3; i++)
            psTask.Add(getTest(i));

        return psTask;
    }

然后將getTest()方法更改為返回Task ,如下所示:

    private static async Task getTest(int i)
    {
        // snip

        await Task.Delay(p.delayUsed);
        Console.WriteLine($"+++ End Process: {nameof(getTest)} {i}, delay: {delay} +++ ");
    }

最后,像這樣創建並執行您的任務:

    static void Main(string[] args)
    {
        var tasks = MultipleTasks();

        tasks.Add(Hello(40));
        tasks.Add(Bye(10));
        
        Task.WaitAll(tasks.ToArray());

        Console.ReadKey();
    }

output 應該是您正在尋找的:

在此處輸入圖像描述

這就是我想要實現的目標,非常感謝您的幫助。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;

namespace taskApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"++++++++++++++++++++++++++++++++++++++++ ");
            Console.WriteLine($"+++ Asynchronous code +++ ");
            Console.WriteLine($"++++++++++++++++++++++++++++++++++++++++ ");
            List<Task<MyClass>> tasks = MultipleTasks();
            Task<MyClass> task2 = Hello(400);
            Task<MyClass> task3 = Bye(10);

            tasks.Add(task3);
            tasks.Add(task2);

            Task.WaitAll(tasks.ToArray());

            //from here it runs synchronously

            MyClass a = task2.Result;
            MyClass b = task3.Result;

            List<MyClass> c = tasks.Select(c => c.Result).ToList();
            Console.WriteLine($"++++++++++++++++++++++++++++++++++++++++ ");
            Console.WriteLine($"+++ Synchronous code ++++ ");
            Console.WriteLine($"++++++++++++++++++++++++++++++++++++++++ ");
            Console.WriteLine($"+++ Run {nameof(task2)}: message {a.message}, delay {a.delayUsed}+++ ");
            Console.WriteLine($"+++ Run {nameof(task3)}: message {b.message}, delay {b.delayUsed}+++ ");
            Console.WriteLine();

            foreach (var item in c)
            {
                Console.WriteLine($"+++ Run {nameof(tasks)}: message: {item.message}, delay {item.delayUsed} +++ ");
            }
            Console.WriteLine($"++++++++++++++++++++++++++++++++++++++++ ");
        }

        private static async Task<MyClass> Hello(int delay)
        {
            MyClass p = new MyClass();
            p.delayUsed = delay;
            p.message = $"Procedure {nameof(Hello)}";

            await Task.Delay(delay);
            Console.WriteLine($"+++ End Process: {nameof(Hello)}, delay: {delay} +++ ");
            return p;
        }

        private static async Task<MyClass> Bye(int delay)
        {
            MyClass p = new MyClass();
            p.delayUsed = delay;
            p.message = $"Procedure {nameof(Bye)}";
            await Task.Delay(delay);
            Console.WriteLine($"+++ End Process: {nameof(Bye)}, delay: {delay} +++ ");
            return p;
        }
        private static List<Task<MyClass>> MultipleTasks()
        {
            List<Task<MyClass>> psTask = new List<Task<MyClass>>();

            for (int i = 0; i < 3; i++)
                psTask.Add(getTest(i));

            return psTask;
        }

        private static async Task<MyClass> getTest(int i)
        {
            MyClass p = new MyClass();
            int delay = 0;
            switch (i)
            {
                case 0:
                    delay = 4000;
                    p.delayUsed = delay;
                    break;
                case 1:
                    delay = 1000;
                    p.delayUsed = delay;
                    break;
                case 2:
                    delay = 7000;
                    p.delayUsed = delay;
                    break;
                case 3:
                    delay = 2000;
                    p.delayUsed = delay;
                    break;
                default:
                    delay = 0;
                    break;
            }

            p.message = $"Procedure {nameof(getTest)}({i})";
            await Task.Delay(p.delayUsed);
            Console.WriteLine($"+++ End Process: {nameof(getTest)}({i}), delay: {delay} +++ ");
            return p;
        }
    }

    public class MyClass
    {
        public int delayUsed { get; set; }
        public string message { get; set; }
    }
}

結果

++++++++++++++++++++++++++++++++++++++++
+++ Asynchronous code +++
++++++++++++++++++++++++++++++++++++++++
+++ End Process: Bye, delay: 10 +++
+++ End Process: Hello, delay: 400 +++
+++ End Process: getTest(1), delay: 1000 +++
+++ End Process: getTest(0), delay: 4000 +++
+++ End Process: getTest(2), delay: 7000 +++
++++++++++++++++++++++++++++++++++++++++
+++ Synchronous code ++++
++++++++++++++++++++++++++++++++++++++++
+++ Run task2: message Procedure Hello, delay 400+++
+++ Run task3: message Procedure Bye, delay 10+++

+++ Run tasks: message: Procedure getTest(0), delay 4000 +++
+++ Run tasks: message: Procedure getTest(1), delay 1000 +++
+++ Run tasks: message: Procedure getTest(2), delay 7000 +++
+++ Run tasks: message: Procedure Bye, delay 10 +++
+++ Run tasks: message: Procedure Hello, delay 400 +++
++++++++++++++++++++++++++++++++++++++++

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM