0

以下の「プロデューサー」を介して外部ソケット接続からデータを取得しています。

データを に配置し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;
    }
}
4

1 に答える 1

0

BlockingCollection は遅くありません。同じリソースを競合する別のスレッドがありました。

どうもありがとう。

于 2014-07-15T09:11:00.003 に答える