首页 > 解决方案 > 从列表运行任务

问题描述

我正在尝试使用以下方法运行任务列表:

List<Task> tasks = new List<Task>();

tasks.Add(new Task(() => this.firstMethod()));
tasks.Add(new Task(() => this.secondMethod()));

但是,如果我使用以下两个示例之一,则会遇到以下问题:

foreach (Task task in tasks)
{
    await Task.Run(() => task);
}

在第一种情况下,任务根本不运行。

foreach (Task task in tasks)
{
    task.Start();
    task.Wait();
}

在第二种情况下,它只运行一次,然后我收到以下错误:

不能在已完成的任务上调用开始

我错过了什么?

标签: c#asp.netblazorblazor-client-side

解决方案


这是一个单元测试,展示了如何做到这一点:

    public class TasksTests
    {
        private readonly ITestOutputHelper _output;

        public TasksTests(ITestOutputHelper output)
        {
            _output = output ?? throw new ArgumentNullException(nameof(output));
        }

        [Fact]
        public async Task CanCreateAndRunTasks()
        {
            var tasks = new List<Task>
            {
                new Task(() => _output.WriteLine("Task #1")),
                new Task(() => _output.WriteLine("Task #2"))
            };

            tasks.ForEach(t => t.Start());

            await Task.WhenAll(tasks);
        }
    }

您首先创建任务。然后你需要启动它们。最后,您需要等待它们,例如,使用Task.WhenAll.


推荐阅读