[英]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.