Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在所有任务结束后运行多个任务并获得结果?_C#_Asynchronous_Async Await_Task - Fatal编程技术网

C# 如何在所有任务结束后运行多个任务并获得结果?

C# 如何在所有任务结束后运行多个任务并获得结果?,c#,asynchronous,async-await,task,C#,Asynchronous,Async Await,Task,如何获得这些任务的结果(bool) public static Random rnd = new Random(); static void Main() { var tasks = new Task[10]; for (int i = 0; i < 10; i++) { tasks[i] = new Task(async () => await T()); } Task.WaitAll(tasks); for

如何获得这些任务的结果(bool)

public static Random rnd = new Random();

static void Main()
{
    var tasks = new Task[10];

    for (int i = 0; i < 10; i++)
    {
        tasks[i] = new Task(async () => await T());
    }

    Task.WaitAll(tasks);

    for (int i = 0; i < tasks.Length; i++)
    {
        Console.WriteLine($"Task {i} result = {tasks[i].?????????}");
    }

    Console.ReadKey();
}

public static async Task<bool> T()
{
    await Task.Delay(500);
    return rnd.Next(2) == 1 ? true : false;
}
public static Random rnd=new Random();
静态void Main()
{
var任务=新任务[10];
对于(int i=0;i<10;i++)
{
tasks[i]=新任务(async()=>await T T());
}
Task.WaitAll(任务);
for(int i=0;i
您还可以使
Main()
方法
异步
并使用而不是。当将
Task
分配给数组项时,只需使用
T()
,不需要像
newtask(async()=>await T T())那样执行

static async Task Main()
{
var任务=新任务[10];
对于(int i=0;i<10;i++)
{
任务[i]=T();
}
等待任务。何时(任务);
for(int i=0;i
正如@GSerg所指出的,使用
任务
构造函数在整个行业被认为是不好的做法。这并不是说它本身就有问题,它只是让事情变得比需要的更复杂,没有什么好的理由。如果您确实需要使用这种编程技术,以下是您可以使用的方法:

var tasks = new Task<bool>[10];

for (int i = 0; i < 10; i++)
{
    var task = new Task<Task<bool>>(async () => await T());
    task.Start(); // Starts the outer task that creates the inner task
    tasks[i] = await task;
}

await Task.WhenAll(tasks);

for (int i = 0; i < tasks.Length; i++)
{
    Console.WriteLine($"Task {i} result = {await tasks[i]}");
}
var tasks=新任务[10];
对于(int i=0;i<10;i++)
{
var task=新任务(异步()=>await T T());
task.Start();//启动创建内部任务的外部任务
任务[i]=等待任务;
}
等待任务。何时(任务);
for(int i=0;i
新建任务()
返回未启动的任务。通常不直接使用构造函数构造任务。在您的情况下,您应该使用
tasks[i]=T()
。如果这回答了您的问题,请告诉我。由于不必要的任务包装,这会给IMO带来极大的复杂性。乍一看,它似乎是按顺序启动任务,而实际上并非如此。@GSerg yeap,外部任务是按顺序等待的,而内部任务是同时等待的。如果我知道内部任务的创建是CPU密集型的,我可能会尝试使用这种技术。换句话说,如果在
T()
方法中的第一次等待之前有大量的计算,那么它将无法实现任何目标,因为没有
任务。在您这边或
T()的开始运行
这些初始计算
无论如何都会阻止您。@GSerg只有在您使用启动任务时,它才会阻止。如果用它启动,它将不会阻塞,因为此方法将要执行的任务调度到当前的
TaskScheduler
。我明白了,它们都将转到线程池线程。嗯,这是另一件在阅读此代码时不会跳出来的事情:)