在我的Run()方法中,我调用异步方法:
public override void Run()
{
RunAsync(_tokenSource.Token).Wait();
}
我知道我不能在这里使用async / await,所以我必须在RunAsync()结束时调用Wait()。
RunAsync()方法如下:
public async Task ProcessMessagesAsync(CancellationToken token)
{
await Process(token);
}
此Process方法指向无限循环周期并启动许多任务取决于队列消息。
我的问题是我想启动这个Process()方法,例如5次paralel。每个Process()方法都有很长的运行时间,并且需要进行大量的CPU密集型计算。我想将此任务的编号设置为5.如果每个任务都忙,则用户必须等待一段时间才能执行请求。如果其中一个任务完成执行,则可以开始处理下一个请求。我尝试了几种方法来实现这种逻辑而没有成功。
我试图像以下那样实现:
列出任务=新列表();
for (int i = 0; i < 5; i++)
{
tasks.Add(Process(token));
}
foreach (var item in tasks)
{
item.Start();
}
但是这些任务根本没有开始。
我该如何实现这种逻辑?
答案 0 :(得分:0)
我相信您的任务正在启动,但实际调用Start
会导致异常。此外,您的代码不会等待它们完成,因此工作者角色将停止。
这应该有效:
List tasks = new List();
for (int i = 0; i < 5; i++)
{
tasks.Add(ProcessAsync(token));
}
await Task.WhenAll(tasks);
您可能还想考虑使用TPL数据流。