代码之家  ›  专栏  ›  技术社区  ›  Houman

是否顺序运行多个线程?

  •  1
  • Houman  · 技术社区  · 12 年前

    也许我的方法不对,请随时纠正我。

    我的服务有以下方法:

    public void PublishPriceChange()
    {
         for (int i = 0; i < 200; i++)
         {
              Task.Run(() =>
              {
                   int j = i;
                   lock (_locker)
                   {
                      TransformPrices(_quotes);
                      PriceChangeEventArgs e = new PriceChangeEventArgs(_quotes);
                      PriceChanged(this, e);
                   }
               });                
         }            
    }
    

    _quotes 包含当天的开盘价,以及 TransformPrices() 只需在每次通话时稍微改变这些价格。这模拟了一天中的变化。因此,这些任务必须按顺序运行。

    然而,让它们在线程池中这样运行意味着每个任务都是并行运行的,不再是按顺序运行的。

    显然,我可以在没有多线程的情况下运行它们以获得所需的效果。但是,由于计算需要一些时间,所以最好在后台执行这些任务时保持服务的响应。

    也许我可以用 Continuations (获奖者)但不确定如何将其贯穿始终。 有什么建议吗?

    1 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    因此,您需要按顺序转换价格。 您的目标似乎是保持服务响应(即,释放调用线程以执行其他工作)。

    为什么不使用任务来运行整个循环?

    public async Task PublishPriceChange()
    {
        await Task.Run(() =>
        {
            lock (_locker)
            {
                for (int i = 0; i < 200; i++)
                {                  
                    TransformPrices(_quotes);
                    PriceChangeEventArgs e = new PriceChangeEventArgs(_quotes);
                    PriceChanged(this, e);
                }
            }  
        });           
    }
    
    • 你最好等待任务,你可能不想有即发即弃的行为( which is not advisable for most scenarios ).
    • 如果 您使用锁来确保循环将按顺序运行,您可以删除它。
    • 否则,如果有机会 PublishPriceChange 将在第一次调用完成之前第二次调用,将锁移到循环外-通过锁定一次而不是200次,可以将上下文切换所导致的开销最小化。
    推荐文章