使用超时运行并行ForEach

时间:2013-12-02 16:10:31

标签: c# task-parallel-library

我有一套交易对象,每个都有2个属性 - 现货价格和远期价格。我需要在后台设置现货价格属性和远期价格,因为他们从第三方服务获得这些价格慢。如果成功获取现货价格或在一定时间内提取现货价格,我只需要计算远期价格。

以下是代码:

public class Trade
{
    public double SpotPrice { get; set; }
    public double ForwardPrice { get; set; }
}

static void Main(string[] args)
{
    var trades = new List<Trade> 
    {
        new Trade(), new Trade(), new Trade(), new Trade()
    };

    Parallel.ForEach(trades, (trade) =>
    {
        var pipeline = Task.Factory.StartNew<Trade>(() =>
        {
            trade.SpotPrice = WaitAndReturnPrice(TimeSpan.FromSeconds(2));
            Console.WriteLine("Spot Price:" + trade.SpotPrice);
            return trade;

        }).ContinueWith(t =>
        {
            var tradeObject = t.Result;

            tradeObject.ForwardPrice = WaitAndReturnPrice(TimeSpan.FromSeconds(2));
            Console.WriteLine("Forward Price:" + trade.ForwardPrice);
        });
    });
    Console.ReadLine();
}

static Random random = new Random();

private static double WaitAndReturnPrice(TimeSpan fromSeconds)
{
    Thread.Sleep(fromSeconds);
    return random.NextDouble();
}      

我添加了一个方法WaitAndReturnPrice来模拟价格被提取然后延迟。

我面临着这种方法的多个问题,主要是由于我对TPL缺乏了解。问题是:

  1. 如何在计算现货价格时引入超时?即我必须说现货价格的提取应在2秒内完成,否则不要再继续计算远期价格。

  2. 如何在获取现货价格时处理发生的任何异常,如果发生这种情况,我如何中止计算远期价格?

  3. 如果上述1或2或两者都与1个交易对象发生,我如何继续其余的交易对象并仍尝试获取它们的现货价格和远期价格?

    < / LI>

    你能帮我解决这个问题吗?

    请注意,我使用的是 .NET4.0 ,而不是那个(所以没有异步和等待)。

1 个答案:

答案 0 :(得分:0)

我不会使用并行循环,我将使用线程池在后台获取价格:

foreach (var trade in trades) {
  ThreadPool.QueueUserWorkItem(new WaitCallback(FetchPrice), trade);
} 

. . . .

void FetchPrice(object tradeObj)
{
  var trade = (Trade)tradeObj;
  try {
    trade.SpotPrice = WaitAndReturnPrice(TimeSpan.FromSecond(2));
    // . . . compute forward price ...   
  } catch (TimeOutException) {
    // . . . compute forward price in case of time-out fetching the spot price...   
  } catch (Exception ex) {
    // ...handle other errors
  }
} 

超时的处理(抛出'TimeOutException`)必须在获取价格的函数内部完成,因为它取决于在那里使用的确切机制。