顺序运行多个线程?

时间:2014-02-19 11:45:29

标签: c# .net multithreading .net-4.5

也许我的做法是错的,随时纠正我。

我的服务有以下方法:

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 个答案:

答案 0 :(得分:2)

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

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

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次,您将最小化由上下文切换。