加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 20:04:01 所属栏目:百科 来源:网络整理
导读:我有一些以下形式的代码: static async Task DoSomething(int n) { ...}static void RunThreads(int totalThreads,int throttle) { var tasks = new ListTask(); for (var n = 0; n totalThreads; n++) { var task = DoSomething(n); tasks.Add(task); } Ta
我有一些以下形式的代码:

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

任务完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读