在C#中,在线程之间传递数据的一种快速、高效的方法是什么?

在C#中,在线程之间传递数据的一种快速、高效的方法是什么?,c#,concurrency,C#,Concurrency,我有一个单进程、双线程的应用程序。线程1将收听市场数据提要并更新数千只股票的最新报价。线程2将以采样频率运行计时器,并对最近的报价进行快照处理。实际上,我需要一个非常快速的市场数据源 我对解决方案的第一个猜测是使用阻塞队列。为此,我需要将计时器功能移到线程1中,这可以通过在每次报价更新时检查时钟来实现,并以采样频率将报价的快照发送到队列中。我在这里担心的是,队列将消耗大量内存,而垃圾收集将减慢速度 我的第二个猜测是让线程1以采样频率将数据复制到锁定的成员中,线程2可以访问该频率。我在这里担心的是

我有一个单进程、双线程的应用程序。线程1将收听市场数据提要并更新数千只股票的最新报价。线程2将以采样频率运行计时器,并对最近的报价进行快照处理。实际上,我需要一个非常快速的市场数据源

我对解决方案的第一个猜测是使用阻塞队列。为此,我需要将计时器功能移到线程1中,这可以通过在每次报价更新时检查时钟来实现,并以采样频率将报价的快照发送到队列中。我在这里担心的是,队列将消耗大量内存,而垃圾收集将减慢速度

我的第二个猜测是让线程1以采样频率将数据复制到锁定的成员中,线程2可以访问该频率。我在这里担心的是锁会很慢

我的第三个猜想是,这会使引用原语变得易变。因为一个线程只写,一个线程只读,这可能是合适的


对于这个对延迟敏感的应用程序,是否有一种在线程之间通信数据的最佳实践方法?这不是超高频应用。我可以容忍数十毫秒左右的延迟。

如果只有两个线程访问此资源(即不需要并发读取),那么最简单(也是最快的一个)的方法就是使用
锁关键字:

public class QuoteStore
{
    private readonly List<Quote> _quotes = new List<Quote>();
    private readonly object _mutex = new object();

    public ReadOnlyCollection<Quote> GetQuotes()
    {
      lock (_mutex)
      {
        return _quotes.ToReadOnly();
      }
    }

    public void AddQuote()
    {
      lock (_mutex)
      {
        _quotes.Add(quote);
      }
    }
}
公共类QuoteStore
{
私有只读列表_quotes=new List();
私有只读对象_mutex=新对象();
公共只读集合GetQuotes()
{
锁(互斥)
{
return _quotes.toreadoly();
}
}
public void AddQuote()
{
锁(互斥)
{
_引号。添加(引号);
}
}
}
但是,如果需要并发读取,这将非常适合。您可以在复制数据时获取读锁,在写入数据时获取写锁,例如:

public class QuoteStore : IDisposable
{
    private readonly ReaderWriterLockSlim _mutex = new ReaderWriterLockSlim();
    private readonly List<Quote> _quotes = new List<Quote>();

    public ReadOnlyCollection<Quote> GetQuotes()
    {
      _mutex.EnterReadLock();
      try
      {
        return _quotes.ToReadOnly();
      }
      finally
      {
        _mutex.ExitReadLock();
      }
    }

    public void AddQuote()
    {
      _mutex.EnterWriteLock();
      try
      {
        _quotes.Add(quote);
      }
      finally
      {
        _mutex.ExitWriteLock();
      }
    }

    public void Dispose() 
    {
        _mutex.Dispose();
    }
}
公共类QuoteStore:IDisposable
{
私有只读ReaderWriterLockSlim _mutex=new ReaderWriterLockSlim();
私有只读列表_quotes=new List();
公共只读集合GetQuotes()
{
_mutex.EnterReadLock();
尝试
{
return _quotes.toreadoly();
}
最后
{
_mutex.exitradlock();
}
}
public void AddQuote()
{
_mutex.EnterWriteLock();
尝试
{
_引号。添加(引号);
}
最后
{
_mutex.ExitWriteLock();
}
}
公共空间处置()
{
_mutex.Dispose();
}
}

或者,如果您使用的是.NET4或更高版本,那么有许多出色的可并发修改的集合,您可以毫无问题地使用它们(它们是无锁对象,通常非常快速且可靠!)

这不是生产者-消费者排队的情况吗?消费者将等待(Monitor.wait)生产者在新饲料进入时发出脉冲。一旦新的/更新的提要出现,生产者将填充队列和fire Monitor.Pulse

@Amarplaspure谢谢,拼写错误修复!谢谢你的回答。我会试着启动。你觉得使用volatile怎么样?@RichC必要时我认为应该使用它。阅读有关volatile的一些信息。在我上面给出的代码片段中,
volatile
不是必需的。