我通过下面的“Producer”从外部套接字连接获取数据。
我将数据放入BlockingCollection
,然后由消费者阅读。如果消费者在一段固定的时间内没有收到数据,那么无论如何它都会被激活,这样我的ProcessDataOnGrid
会在数据到达时执行某些操作,或者在x毫秒后执行。{/ p>
问题是我已经读过BlockingCollection
是首选的方法,但是看起来很慢。
我获得外部数据和调用ProcessDataOnGrid
之间的平均间隔为150毫秒。我是否错误地使用了这个,或者是否有更好的方法等待数据但仅在一段固定的时间内?
public BlockingCollection<TickRecord> trPipe = new BlockingCollection<TickRecord>();
制片:
public void ProcessMarketData(string key, string intraMessage)
{
//////////
// Gets External data from intraMessage
////////////
try
{
if (GRID!=null)
{
TickRecord tr = new TickRecord(intraMessage);
while ( ! AddToFeedPipe(key, tr) )
{
Thread.Sleep(1000);
}
}
}
catch (Exception e)
{
}
}
}
public bool AddToFeedPipe(string key, TickRecord tr)
{
try
{
foreach (var s in cReader.STREAMS)
{
if (s.key == key)
{
s.trPipe.Add(tr);
return true;
}
}
return false;
}
catch (Exception)
{
return false;
}
}
消费者:
public void Read()
{
DateTime DTNOW = DateTime.UtcNow;
TimeSpan gridNextTS = G.gridNextDT.Subtract(DTNOW);
try
{
if (trPipe.TryTake(out tr,gridNextTS) == false)
{
tr = trGAP;
}
else if (tr == null)
{
EOF = true;
return;
}
ProcessDataOnGrid(tr);
}
catch (Exception e)
{
tr = null;
EOF = true;
return;
}
}
答案 0 :(得分:0)
BlockingCollection并不慢。我有另一个竞争相同资源的线程。
非常感谢。