Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C:管理线程等待队列_C#_Multithreading - Fatal编程技术网

C# C:管理线程等待队列

C# C:管理线程等待队列,c#,multithreading,C#,Multithreading,我已多次触发事件。每次触发都会产生一个线程,该线程将处理一个输入,并且这些处理必须是连续的 代码如下: void TcpClient_DataRead(object sender, DataReadEventArgs e) { //the first stops the other ones this.parsingXML.WaitOne(); //processing the string string pop = Enc

我已多次触发事件。每次触发都会产生一个线程,该线程将处理一个输入,并且这些处理必须是连续的

代码如下:

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();
    }
在这里,我试图让另一个线程等待并在前一个线程的执行结束后恢复,但是这个解决方案恢复了所有等待的线程


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

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

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

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

ConcurrentQueue<DataReadEventArgs> list;
Init()
{
   var list = new ConcurrentQueue<DataReadEventArgs>();
   Task.Factory.StartNew(()=>DataRead());
   OnTcpClientDataRead += TcpClient_DataRead;
}
一个始终运行的作业,它为队列中的所有数据处理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循环检查它是否中断了迭代。

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

ConcurrentQueue<DataReadEventArgs> list;
Init()
{
   var list = new ConcurrentQueue<DataReadEventArgs>();
   Task.Factory.StartNew(()=>DataRead());
   OnTcpClientDataRead += TcpClient_DataRead;
}
一个始终运行的作业,它为队列中的所有数据处理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循环检查它是否破坏了迭代。

听起来像是TPL数据流的一个不错的工作:听起来像是TPL数据流的一个不错的工作:+1,是的,而且还可以避免新手经常出错的线程微管理,那些经验丰富的人永远不会尝试。不幸的是,OP似乎读过很多书中的一本,一本叫做“线程简介”的书/网站,这些书/网站似乎总是从不断创建线程开始,然后等待它们以join或其他方式结束。正如我之前多次发布的那样,这些文章的作者应该被拴在一根木桩上,他们的书籍/印刷品堆在一起,并使用火炬。是的,还要避免新手经常出错的线程微观管理,那些经验丰富的人永远不会尝试。不幸的是,OP似乎读过很多书中的一本,一本叫做“线程简介”的书/网站,这些书/网站似乎总是从不断创建线程开始,然后等待它们以join或其他方式结束。正如我之前多次发布的那样,这些文章的作者应该被绑在一个木桩上,他们的书籍/打印件堆放在一起,并使用火炬。如果TcpClient_DataRead同时被两个线程访问,会发生什么情况?在这种情况下不起作用,您需要在开始时对其进行初始化。如果两个线程同时访问TcpClient_DataRead,会发生什么情况?在这种情况下无法工作,您需要在开始时对其进行初始化。