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
,以模拟在延迟之后获取价格
我在使用这种方法时面临多个问题,主要是因为我对第三方物流缺乏了解。这些问题是:
请注意,我使用的是.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)工作,但它并不适合您的问题,因此您的解决方案将很尴尬。