使用BlockingCollection的消费者/生产者看起来很慢

时间:2014-07-12 08:27:59

标签: c# performance blockingcollection

我通过下面的“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;
    }
}

1 个答案:

答案 0 :(得分:0)

BlockingCollection并不慢。我有另一个竞争相同资源的线程。

非常感谢。