C#:管理线程等待队列

时间:2013-05-28 12:32:51

标签: c# multithreading

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

这是代码:

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();
    }

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

是否有管理等待线程队列的方法?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

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

// PUBLISHER

void TcpClient_DataRead(object sender, DataReadEventArgs e)
 {
    list.Enqueue(e);
}

一个始终运行的作业,它处理队列中所有数据的BufferizeXml,如果列表为空,则需要暂停一秒钟并再次继续//消费者

void DataRead()
{
   while(true) 
   {
    if (list.Count ==0)
    Thread.Sleep(1000);

    string pop;
    list.TryDequeue(out pop);
    Encoding.ASCII.GetString(pop);
    BufferizeXML(pop);
   }
 }

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