gpt4 book ai didi

c# - 多线程冲突

转载 作者:行者123 更新时间:2023-11-30 20:59:31 26 4
gpt4 key购买 nike

我的 C# 窗体运行两个线程,一个线程监听传入的数据,另一个线程处理数据,以便我可以使用它。由于某种原因,一旦进程线程启动,监听线程就不再执行。

Thread th1 = new Thread(new ThreadStart(zeroMQConn.Listen));
th1.Start();
Thread th2 = new Thread(() => ProcessData(zeroMQConn));
th2.Start();

当我调试它时,它启动 th1 进入它,然后 th2 启动,它永远不会回到 th1,我的数据返回 null。

public void Listen()
{
while (true)
{
try
{
byte[] zmqBuffer = new byte[102400];
int messageLength;
lockForZMQ.EnterWriteLock();
messageLength = socket.Receive(zmqBuffer);
lockForZMQ.ExitWriteLock();
byte[] message = new byte[messageLength];
Buffer.BlockCopy(zmqBuffer, 0, message, 0, messageLength);
PriceBookData priceBook = PriceBookData.CreateBuilder().MergeFrom(message).Build();
double Type = priceBook.GetPb(0).QuoteType;
if (Type == 0.0)
{
lockForList.EnterWriteLock();
CachedBidBooks = priceBook;
lockForList.ExitWriteLock();
}
else
{
lockForList.EnterWriteLock();
CachedAskBooks = priceBook;
lockForList.ExitWriteLock();
}
}
catch (ZmqException ex)
{
MessageBox.Show(ex.Message);
}
}
}

public void ProcessData(object connection)
{
while (true)
{
priceBookData = ((ZeroMQClass)connection).GetPriceBook();
}

}

public List<PriceBookData> GetPriceBook()
{
List<PriceBookData> AskAndBid = new List<PriceBookData>();
lockForList.EnterWriteLock();
if (CachedAskBooks != null && CachedBidBooks != null)
{
AskAndBid.Add(CachedBidBooks);
AskAndBid.Add(CachedAskBooks);
CachedBidBooks = null;
CachedAskBooks = null;
lockForList.ExitWriteLock();
return AskAndBid;
}
lockForList.ExitWriteLock();
return null;
}

最佳答案

您这里有一个生产者-消费者模型,但您没有正确同步它们。问题在于,您拥有的不是某种缓冲区或准备好处理的数据集合,而是一个变量,并且您完全同步对该变量的访问。这意味着生产者永远无法在消费者工作时工作。

BlockingCollection<T>在处理生产者/消费者队列时是一个很棒的类。

var queue = new BlockingCollection<PriceBookData>();

Task.Factory.StartNew(() =>
{
while (true)
{
byte[] zmqBuffer = new byte[102400];
int messageLength;
socket.Receive(zmqBuffer);
byte[] message = new byte[messageLength];
Buffer.BlockCopy(zmqBuffer, 0, message, 0, messageLength);
PriceBookData priceBook = PriceBookData.CreateBuilder().MergeFrom(message).Build();
double Type = priceBook.GetPb(0).QuoteType;
queue.Add(priceBook);
}
}, TaskCreationOptions.LongRunning);

Task.Factory.StartNew(() =>
{
foreach (var item in queue.GetConsumingEnumerable())
{
//do stuff with item
}
}, TaskCreationOptions.LongRunning);

关于c# - 多线程冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15481794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com