在Microsoft Azure Worker Role中启动并运行给定数量的任务

时间:2014-09-15 21:25:52

标签: c# multithreading azure asynchronous azure-worker-roles

在我的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();
}

但是这些任务根本没有开始。

我该如何实现这种逻辑?

1 个答案:

答案 0 :(得分:0)

我相信您的任务正在启动,但实际调用Start会导致异常。此外,您的代码不会等待它们完成,因此工作者角色将停止。

这应该有效:

List tasks = new List();
for (int i = 0; i < 5; i++)
{
  tasks.Add(ProcessAsync(token));
}
await Task.WhenAll(tasks);

您可能还想考虑使用TPL数据流。