2011-03-27 71 views
1

我开发在Windows Server上使用C#和.NET 3.5 2008年什么是C#中的最佳多线程技术

中的TcpListener任务是跑了很多的TcpListener任务 的应用程序:

  1. 听 获得一个XML消息
  2. 从中读出一个ID
  3. 基于ID到发送命令到 特定摄像机拍摄快照,并将其存储在一个文件夹

这是为了在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 
    } 

这是最好的多线程技术吗?该应用程序在运行在Dell PowerEdge 2900 2四核prosessor,我认为这可能走得更快。我该如何能够改善此代码的延迟?

那代码为的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。

+0

哪里是你的'TcpListener'代码? – 2011-03-27 14:34:49

+1

您的应用程序CPU绑定或I/O绑定?你有很多并发访问,或一次只有一个访问? – 2011-03-27 14:36:19

+3

显示并不能帮助我们明白什么重要的代码...我认为TCP代码(或网络流码,或插座码;等等)将是这里重要的... – 2011-03-27 14:39:25

回答

1

目前尚不清楚,在所有

  1. 如何接收请求
  2. 后,你并行运行何种应用

似乎你听不同的插座和分配上的每个线程其中。

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

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

+0

我正在监听此服务器上的一个端口。 – Ramah 2011-03-28 11:10:50

+0

ok ..我改变了它..我正在做的是在这个服务器上监听端口,然后当消息到来时它被读为xml,然后将xml分开,并从中获取id ..所有这一切都在一个线程中。我在另一个线程中调用图像以便能够读取下一个xml消息,而无需等待图像被捕获。这是创造约150线程。我现在会尝试你的建议,希望它会更快。感谢您的帮助 – Ramah 2011-03-28 11:24:06

1

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

关注是不可少的程式码中的代码。

相关问题