微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何限制多个异步任务?

我有一些以下形式的代码

static async Task DoSomething(int n) 
{
  ...
}

static void RunThreads(int totalThreads,int throttle) 
{
  var tasks = new List<Task>();
  for (var n = 0; n < totalThreads; n++)
  {
    var task = DoSomething(n);
    tasks.Add(task);
  }
  Task.WhenAll(tasks).Wait(); // all threads must complete
}

麻烦的是,如果我没有限制线程,事情就会开始崩溃.现在,我想启动最多的节流线程,并且只在旧线程完成时启动新线程.我尝试过几种方法,迄今为止没有一种方法可行.我遇到的问题包括

>任务集合必须完全填充所有任务,无论是活动还是等待执行,否则最终的.Wait()调用只会查看它开始的线程.
>链接执行似乎需要使用Task.Run()等.但是我需要从一开始就引用每个任务,并且实例化任务似乎会自动启动它,这是我不想要的.

这该怎么做?

解决方法

微软的Reactive Extensions(Rx) – NuGet“Rx-Main” – 这个问题排序非常好.

这样做:

static void RunThreads(int totalThreads,int throttle) 
{
    Observable
        .Range(0,totalThreads)
        .Select(n => Observable.FromAsync(() => DoSomething(n)))
        .Merge(throttle)
        .Wait();
}

任务完成.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐