什么是c#中最好的多线程技术

时间:2011-03-27 14:28:00

标签: c# multithreading .net-3.5

我正在开发一个运行大量TcpListener任务的应用程序 在Windows Server 2008上使用c#和.net 3.5

TcpListener任务是:

  1. 听音 获取xml消息
  2. 读取ID 来自它
  3. 向a发送命令 基于ID的特定摄像头 拍摄快照并将其存储在一个 夹
  4. 这意味着在1秒内执行,因此我可以使用相机拍摄快照。我使用以下代码执行此任务有一个延迟:

    private Thread listen_thread;
    
        public void start_listen()
        {
                this.listen_thread = new Thread(new ThreadStart(save_data));
                this.listen_thread.Priority = ThreadPriority.Normal;
                this.listen_thread.Start();
    
        }
        private void save_data()
        {
            //work to be done
        }
    

    这是最好的多线程技术吗?此应用程序在on dell poweredge 2900上运行 使用2个四核处理器,我认为它可以更快。我怎样才能改善此代码的延迟?

    这就是tcplistener的代码

    Int32 port = controller_port;
            try
            {
                //this server ip
                IPAddress localAddr = IPAddress.Parse(this_ip);
                server = new TcpListener(localAddr, port);
                server.Start();
                Byte[] bytes = new Byte[256];
                String data = null;
                while (true)
                {
                    Console.Write("Waiting for a connection... ");
                    TcpClient client = server.AcceptTcpClient();
                    Console.Write("Connected!");
                    data = null;
                    NetworkStream stream = client.GetStream();
                    int i;
                    string add_data = "";
                    Console.Write("Waiting...!");
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        try
                        {
                            string full_row = "";
                            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                            Console.Write("Received from controller: " + data);
                            add_data += data;
                        }
                        catch{}
                    }
                }
             }
    

    然后我将它除以获取ID。

2 个答案:

答案 0 :(得分:1)

这些方法名称错误。 start_listen()不会开始侦听。 save_data()在至少建立连接之前不能保存任何数据。这需要客户端代码首先启动并建立连接。当然,一秒钟很快就消失了。当核心可用时,启动一个线程的时间不会超过几分之一毫秒。

关注代码段中缺少的代码。

答案 1 :(得分:1)

根本不清楚

  1. 您收到请求的方式
  2. 根据您的应用程序并行化
  3. 似乎你在不同的套接字上监听并在每个套接字上分配一个线程。

    我认为这是一个糟糕的选择,因为你无法控制并行度。

    你可以改为只有一个线程不确定地监听所有套接字,并将连接分配给线程池,配置为同时运行最多n个线程,其中n是你机器的并行度(如果你有一个双四核,n等于8)。