以下の「プロデューサー」を介して外部ソケット接続からデータを取得しています。
データを に配置しBlockingCollection
、それをコンシューマーが読み取ります。コンシューマーが一定期間内にデータを受信しない場合、ProcessDataOnGrid
データが到着するたびに、または少なくとも x ミリ秒後に my が何かを実行するように、いずれにせよ発火します。
問題は、これが推奨されるアプローチであると私が読んだことBlockingCollection
ですが、非常に遅いようです。
外部データを取得してから を呼び出すまでの平均時間は 150 ミリ秒ProcessDataOnGrid
です。私はこれを間違って使用していますか、それとも一定期間だけデータを待つより良い方法はありますか?
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;
}
}