c# - 从列表运行任务
问题描述
我正在尝试使用以下方法运行任务列表:
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();
}
在第二种情况下,它只运行一次,然后我收到以下错误:
不能在已完成的任务上调用开始
我错过了什么?
解决方案
这是一个单元测试,展示了如何做到这一点:
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
.
推荐阅读
- .net-core - 仅当在任何其他 Web API 中调用的 Web API 属于同一域时,如何绕过授权过程 - .Net-core 3.1 + Identity-server
- python - python不理解简单的数学问题
- kubernetes - 如何配置 loadBalancer 服务以访问互联网
- reactjs - 如何从语义 UI 反应将参数传递给下拉组件?
- regex - vscode和visual studio之间的正则表达式区别
- google-apps-script - 如何在 Google 表格中设置自动电子邮件提醒
- c++ - Trie*& 和 Trie** 表示相同吗?
- excel - 在将图表从 Excel 粘贴到 Powerpoint 之前,程序继续进行
- android - 为什么我的设计在我使用时会消失
? - flutter - 颤动布局中的卡片视图