也许我的做法是错的,随时纠正我。
我的服务有以下方法:
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
(等待),但不知道如何将这一切链接起来。
有什么建议吗?
答案 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);
}
}
});
}
PublishPriceChange
,则将锁定移到循环外部 - 通过锁定一次而不是200次,您将最小化由上下文切换。