如何从不同的线程/类访问单个并发队列

本文关键字:访问 单个 并发 队列 线程 | 更新日期: 2023-09-27 17:49:43

我希望这个问题有足够的细节。

概述:我的任务是从TCP流中获取数据,并在gui上显示数据,还格式化数据并将其写入文件。我可以单独做所有的项目,但我有一个问题,把它们粘在一起。

在主程序中,我调用tcp_listener

MyTcpListener.start();

mytcpllistener不断循环并读取数据

 public class MyTcpListener
{
    //public string start(ref CQ.ConQueue init_concurrent_queue)
    public static void start()
    {
        TcpListener server = null;
        try
        {
            // Set the TcpListener on port 13000.
            Int32 port = 13000;
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            // TcpListener server = new TcpListener(port);
            server = new TcpListener(localAddr, port);
            // Start listening for client requests.
            server.Start();
            ....
           while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                    Console.WriteLine("Received: {0}", data);
                    //  !!!  ADD DATA TO QUE HERE
                    Program.ConQueue
                    // Process the data sent by the client.
                    data = data.ToUpper();
                    byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
                    data.ToString();
                    // Send back a response.
                    stream.Write(msg, 0, msg.Length);
                    Console.WriteLine("Sent: {0}", data);

                }

在上面的部分中,每当我获得新数据时,我都会将其写入控制台。但是我需要做的是将它放入并发队列,这样我的其他类就可以从并发队列中取出它并写入文件。

我该怎么做呢?我应该在我的主创建对象,并通过引用传递给我的其他线程/类吗?

或者有一种方法,我可以实例化对象多次,但只有一个队列内部创建在内存和所有对象访问它?

如何从不同的线程/类访问单个并发队列

您应该将队列传递给对象

public string start(CQ.ConQueue queue)

我不确定那个对象是什么,但是。net提供了一个线程安全队列,ConcurrentQueue

有这样一种想法,即static变量,无论您创建多少个类的实例,它都只有一个实例。将它们用于您的问题类型是不可取的,因为这不是它们的本意,它隐藏了对象之间队列的共享,并且绝对防止您拥有多个队列。

我注意到,你经过ref,这是不需要的。如果你在c#中传递一个引用类型,实际上传递了一个指向原始对象的指针。通过ref传递有一个不同的,更复杂的含义(你通过引用传递指针),我不认为这是你的意图。

使用ConcurrentQueue类。它包含了多线程操作所需的功能。

信息:

https://msdn.microsoft.com/en-us/library/dd267265%28v=vs.110%29.aspx