c#:管理线程等待队列

本文关键字:等待队列 线程 管理 | 更新日期: 2023-09-27 18:15:46

我已经多次触发了一个事件。每次触发都会产生一个线程来处理一个输入,这些处理必须是顺序的。

这是代码:

void TcpClient_DataRead(object sender, DataReadEventArgs e)
    {
        //the first stops the other ones
        this.parsingXML.WaitOne();
        //processing the string
        string pop = Encoding.ASCII.GetString(e.Data);
        BufferizeXML(pop);
        //restoring execution
        this.parsingXML.Set();
    }

这里我试图让另一个线程等待并在前一个线程的执行结束后恢复,但这个解决方案恢复所有等待的线程。

是否有一个方法来管理队列等待线程?

c#:管理线程等待队列

这是一个典型的情况,您可以使用发布-消费者模式。您可以使用Queue<T>ConcurrentQueue<T>来为事件排队,然后让一个线程脱离队列并执行实际的处理。您只需要一个线程,因为您说它们需要顺序执行,这将避免创建线程的时间。请注意,如果您不能(主要是因为您被迫使用旧版本的框架)使用并发版本,则必须锁定队列访问。

在应用程序初始化时启动任务,创建并发队列,启动数据读取任务,并在此之后绑定事件处理程序

ConcurrentQueue<DataReadEventArgs> list;
Init()
{
   var list = new ConcurrentQueue<DataReadEventArgs>();
   Task.Factory.StartNew(()=>DataRead());
   OnTcpClientDataRead += TcpClient_DataRead;
}

//出版商
void TcpClient_DataRead(object sender, DataReadEventArgs e)
 {
    list.Enqueue(e);
}

一个总是在运行的作业,处理队列中所有的数据BufferizeXml,如果list为空,它会暂停一秒钟,然后再次继续//CONSUMER

void DataRead()
{
   while(true) 
   {
    if (list.Count ==0)
    Thread.Sleep(1000);
    string pop;
    list.TryDequeue(out pop);
    Encoding.ASCII.GetString(pop);
    BufferizeXML(pop);
   }
 }

你可以放一些变量,让while循环检查它是否打破了迭代。