我发了多次事件。每次射击都会产生一个将处理输入的线程,这些处理必须是顺序的。
这是代码:
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();
}
这里我试图让其他线程在前一个线程的执行结束后等待并恢复,但是这个解决方案会恢复所有等待的线程。
是否有管理等待线程队列的方法?
答案 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循环检查它是否打破迭代。