1

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

这是代码:

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

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

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

4

2 回答 2

5

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

于 2013-05-28T12:36:36.473 回答
0

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

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,如果列表为空,则需要暂停一秒钟并再次继续 //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 循环检查它是否会中断迭代。

于 2013-05-28T15:08:19.970 回答