Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行带超时的并行ForEach_C#_Task Parallel Library - Fatal编程技术网

C# 运行带超时的并行ForEach

C# 运行带超时的并行ForEach,c#,task-parallel-library,C#,Task Parallel Library,我有一组交易对象,每个对象都有两个属性-现货价格和远期价格。我需要在后台设置现货价格属性和远期价格,因为他们从第三方服务获取的价格比较慢。我只需要在现货价格成功获取或现货价格在一定时间内获取的情况下计算远期价格 代码如下: public class Trade { public double SpotPrice { get; set; } public double ForwardPrice { get; set; } } static void Main(string[] a

我有一组交易对象,每个对象都有两个属性-现货价格和远期价格。我需要在后台设置现货价格属性和远期价格,因为他们从第三方服务获取的价格比较慢。我只需要在现货价格成功获取或现货价格在一定时间内获取的情况下计算远期价格

代码如下:

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();
}      
公共级贸易
{
公共双点价格{get;set;}
公共双转发价格{get;set;}
}
静态void Main(字符串[]参数)
{
var交易=新列表
{
新贸易,新贸易,新贸易,新贸易
};
Parallel.ForEach(贸易,(贸易)=>
{
var pipeline=Task.Factory.StartNew(()=>
{
trade.SpotPrice=WaitAndReturnPrice(TimeSpan.FromSeconds(2));
控制台.WriteLine(“现货价格:+trade.SpotPrice”);
退货贸易;
}).ContinueWith(t=>
{
var-tradeObject=t.结果;
tradeObject.ForwardPrice=WaitAndReturnPrice(TimeSpan.FromSeconds(2));
控制台.WriteLine(“远期价格:+trade.ForwardPrice”);
});
});
Console.ReadLine();
}
静态随机=新随机();
私有静态双等待和返回价格(时间跨度从秒开始)
{
线程。睡眠(从秒开始);
返回random.NextDouble();
}      
我添加了一个方法
WaitAndReturnPrice
,以模拟在延迟之后获取价格

我在使用这种方法时面临多个问题,主要是因为我对第三方物流缺乏了解。这些问题是:

  • 在计算现货价格时,如何引入超时?i、 我不得不说,现货价格的提取应该在2秒钟内完成,否则就不用继续计算远期价格了

  • 我如何处理在获取现货价格时发生的任何异常,如果发生,我如何中止计算远期价格

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

  • 你能帮我做这个吗


    请注意,我使用的是.NET4.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”)必须在获取价格的函数内部完成,因为它取决于在那里使用的确切机制。

    您可以在.Net 4.0到上使用
    async
    -
    wait
    ,尽管它需要VS 2012。我建议您使用或
    async
    ,它们都支持.NET4.0。您可以强制并行代码(TPL)工作,但它并不适合您的问题,因此您的解决方案将很尴尬。