C# while(true)vs EventWaitHandle通知在";每秒1000次”;处理
我在写交易引擎。我收到来自market Veeeeryyyy的更新。每秒大约有1000次更新,我把它们放在队列中。考虑到我应该如何处理消息,问题是-使用EventWaitHandle合理还是使用C# while(true)vs EventWaitHandle通知在";每秒1000次”;处理,c#,C#,我在写交易引擎。我收到来自market Veeeeryyyy的更新。每秒大约有1000次更新,我把它们放在队列中。考虑到我应该如何处理消息,问题是-使用EventWaitHandle合理还是使用while(true)循环更好 while (true) { queue.wh.WaitOne(); // do I need that to be executed 1000 times per second or just skip it? if (queue.Count > 0
while(true)
循环更好
while (true)
{
queue.wh.WaitOne(); // do I need that to be executed 1000 times per second or just skip it?
if (queue.Count > 0)
queue.Dequeue()
....
或者你可能会提出一些不同的建议…
WaitOne()
足够聪明,可以先使用自旋锁,所以我认为你不会从性能/资源上获得任何东西来更改代码。也许您可以做的唯一一件事就是将if
替换为while
,这样您可以在一个“周期”内处理所有排队的请求。您应该研究这两种方法
我的第一个版本是:
while(true)
{
while(queue.Count > 0)
{
var md;
lock(queue)
{
md = queue.Dequeue();
}
...
}
Thread.Sleap(0);
}
您可以将
WaitOne()
放在else子句中
if (queue.Count > 0)
queue.Dequeue();
else
queue.wh.WaitOne();
几乎不经常;)我每秒处理数万次(5次压缩交换)。你对时间很敏感吗?我不是-我向上换毫秒,频率不高。一个C#程序员的用户名很有趣。Jonas事实上我用Java已经7年了,但现在我不得不用C#,因为它更能满足我的需要:)
队列实际上是我写的,但我认为这在这个问题的范围内并不重要。您的队列对象是并发访问的吗?一个BlockingQueue实现。旋转锁仅由ManualResetEventSlim使用