Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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#_Multithreading_Sockets_Network Programming - Fatal编程技术网

C# 具有返回值的线程化网络侦听器

C# 具有返回值的线程化网络侦听器,c#,multithreading,sockets,network-programming,C#,Multithreading,Sockets,Network Programming,我目前正在尝试完成一个项目,它侦听多个端口并接收传入的数据 DeviceListener类: -我有一个名为PortListener的方法。它有两个参数,分别是IP和端口地址。它持续侦听特定端口的传入数据 -另一种方法称为StartListen,它在线程中运行PortListener 主程序: -它获取端口列表,并使用StartListen方法为每个端口启动PortListener Psuedo Like Code: class DeviceListener() { private s

我目前正在尝试完成一个项目,它侦听多个端口并接收传入的数据

DeviceListener类:

-我有一个名为PortListener的方法。它有两个参数,分别是IP和端口地址。它持续侦听特定端口的传入数据

-另一种方法称为StartListen,它在线程中运行PortListener

主程序:

-它获取端口列表,并使用StartListen方法为每个端口启动PortListener

Psuedo Like Code:

class DeviceListener()
{

   private string PortListener(string ip, int port)
   {
      //listen ip and port. 
      //wait for data. 
      //recieve and return data.

      RecieveData();
      string data = recieved data;
      return data;
   }
   public void StartListen(string ip, int port)
   {
      //start PortListener in a thread
      Thread t = new Thread (() => PortListener(ip,port));
      t.Start();
   }

}

void Main()
{
   ip = ip adress;
   List portlist;
   foreach (port in portlist)
   {
      string data = DeviceListener.StartListen(ip, port);
   }
}
class DeviceListener()
{
    public delegate void PassData(string str);
    public PassData passdata;       

   private void PortListener(string ip, int port)
   {
      //listen ip and port. 
      //wait for data. 
      //recieve and return data.

      RecieveData();
      string data = recieved data;

      passdata(data);
   }
   public void StartListen(string ip, int port)
   {
      //start PortListener in a thread
      Thread t = new Thread (() => PortListener(ip,port));
      t.Start();
   }

}

void Main()
{
   DeviceListener.passdata = new DeviceListener.PassData(Some_Function);

   ip = ip adress;
   List portlist;
   foreach (port in portlist)
   {
      DeviceListener.StartListen(ip, port);
   }

   private void Some_Function(string data)
   {
      //do something with returned string.
   }
}
我的问题是我无法将接收到的数据返回到主程序


是否有方法获取每个PortListener线程的接收数据?

您可以执行以下操作-

  • 添加您希望接收的数据类型的队列。最好使用同步版本或创建自己的版本,这取决于.Net。看见将您得到的每个新内容添加到队列中,并将队列公开,以便其他类可以访问它。其他希望访问传入数据的线程可以从队列中读取数据,并在队列为空时阻塞,或者通过定期检查是否存在项来轮询

  • 另一个选项是使用事件(您的类可以公开存在相关数据的事件,并在数据到达时调用它。其他类将注册并收到新传入数据的通知)


  • 如果您只有一个读取实体,则第一个选项更好;如果多个实体对数据感兴趣,则第二个选项更好。

    您可以执行以下操作-

  • 添加您希望接收的数据类型的队列。最好使用同步版本或创建您自己的,具体取决于.Net。请参阅。将您获得的每个新内容添加到队列中,并使队列公开,以便其他类可以访问它。希望访问传入数据的其他线程可以从队列中读取,如果队列为e,则可以阻止通过定期检查是否存在项目来进行mpty或轮询

  • 另一个选项是使用事件(您的类可以公开存在相关数据的事件,并在数据到达时调用它。其他类将注册并收到新传入数据的通知)


  • 如果您只有一个读取实体,则第一个选项更好;如果多个实体对数据感兴趣,则第二个选项更好。

    我使用委托方法解决了这个问题

    Psuedo Like Code:
    
    class DeviceListener()
    {
    
       private string PortListener(string ip, int port)
       {
          //listen ip and port. 
          //wait for data. 
          //recieve and return data.
    
          RecieveData();
          string data = recieved data;
          return data;
       }
       public void StartListen(string ip, int port)
       {
          //start PortListener in a thread
          Thread t = new Thread (() => PortListener(ip,port));
          t.Start();
       }
    
    }
    
    void Main()
    {
       ip = ip adress;
       List portlist;
       foreach (port in portlist)
       {
          string data = DeviceListener.StartListen(ip, port);
       }
    }
    
    class DeviceListener()
    {
        public delegate void PassData(string str);
        public PassData passdata;       
    
       private void PortListener(string ip, int port)
       {
          //listen ip and port. 
          //wait for data. 
          //recieve and return data.
    
          RecieveData();
          string data = recieved data;
    
          passdata(data);
       }
       public void StartListen(string ip, int port)
       {
          //start PortListener in a thread
          Thread t = new Thread (() => PortListener(ip,port));
          t.Start();
       }
    
    }
    
    void Main()
    {
       DeviceListener.passdata = new DeviceListener.PassData(Some_Function);
    
       ip = ip adress;
       List portlist;
       foreach (port in portlist)
       {
          DeviceListener.StartListen(ip, port);
       }
    
       private void Some_Function(string data)
       {
          //do something with returned string.
       }
    }
    

    我通过使用委托方法解决了这个问题

    Psuedo Like Code:
    
    class DeviceListener()
    {
    
       private string PortListener(string ip, int port)
       {
          //listen ip and port. 
          //wait for data. 
          //recieve and return data.
    
          RecieveData();
          string data = recieved data;
          return data;
       }
       public void StartListen(string ip, int port)
       {
          //start PortListener in a thread
          Thread t = new Thread (() => PortListener(ip,port));
          t.Start();
       }
    
    }
    
    void Main()
    {
       ip = ip adress;
       List portlist;
       foreach (port in portlist)
       {
          string data = DeviceListener.StartListen(ip, port);
       }
    }
    
    class DeviceListener()
    {
        public delegate void PassData(string str);
        public PassData passdata;       
    
       private void PortListener(string ip, int port)
       {
          //listen ip and port. 
          //wait for data. 
          //recieve and return data.
    
          RecieveData();
          string data = recieved data;
    
          passdata(data);
       }
       public void StartListen(string ip, int port)
       {
          //start PortListener in a thread
          Thread t = new Thread (() => PortListener(ip,port));
          t.Start();
       }
    
    }
    
    void Main()
    {
       DeviceListener.passdata = new DeviceListener.PassData(Some_Function);
    
       ip = ip adress;
       List portlist;
       foreach (port in portlist)
       {
          DeviceListener.StartListen(ip, port);
       }
    
       private void Some_Function(string data)
       {
          //do something with returned string.
       }
    }
    

    谢谢Vadim。我会看看文章。从线程的角度来看,这正是管理传入数据的正确方法。根据您期望的连接数,选项2可能更好。存储数据,向线程发送信号,表示您有可用数据,然后返回。这允许您在维护其他连接时具有非常低的延迟s、 线程可以轻松地进行处理。谢谢Vadim。我会看看文章。从线程的角度来看,这正是管理传入数据的正确方法。根据您期望的连接数,选项2可能更好。存储数据,向线程发送信号,表示您有可用数据,然后返回。这使您可以非常轻松地服务其他连接时的延迟。线程可以轻松地执行该进程。