实例化类时后台工作线程未启动

本文关键字:线程 启动 工作 后台 实例化 | 更新日期: 2023-09-27 18:36:36

我有一个名为ClientSocketService的类,当实例化时,它会创建一个后台线程并开始通过套接字侦听。

客户端套接字服务.cs

public ClientSocketService(Socket sock) : this()
    {
        //Assign the Incomign socket to the Socket variable.
        _serviceSocket = sock;
        //Get and assing the network stream for the Socket.
        this._nStream = new NetworkStream(sock);
        //Initialize the Reciever Thread.
        RecieverThread = new BackgroundWorker();
        RecieverThread.DoWork += new DoWorkEventHandler(RecieverThread_StartListening);
        RecieverThread.RunWorkerAsync();
    }

我在另一个名为 server 的类中创建此类的对象,在创建类对象后,另一个方法将该类添加到集合并引发 ClientAdd 事件处理程序。

private void AcceptClientSocket(Socket sock)
    {            
        //Initialize new ClientSocketService.            
        ClientSocketService csservice = new ClientSocketService(sock);
        //Add the client to the List
        this.AddClientToList(csservice);
    }
    /// <summary>
    /// Adds the Client to the List.
    /// </summary>
    /// <param name="csservice"></param>
    private void AddClientToList(ClientSocketService csservice)
    {
        //Check for any abnormal Disconnections
        this.CheckAbnormalDC(csservice);
        //Ad the ClientSocketService to the List.
        this._clientsocketservices.Add(csservice);
        //Raise the Client Added Event Handler.
        this.OnClientAdded(new ClientSocketServiceEventArgs(csservice));
    }

我现在面临的问题是,ClientSocketService 类中的后台工作线程在调用所有添加的事件处理程序事件后启动。

任何帮助将不胜感激。

谢谢

实例化类时后台工作线程未启动

看起来您有几个线程正在运行,并且需要在此线程之间进行某种同步。例如:

  • 主线程
  • 线程1
  • 线程2

在这种情况下,即使您在 Thread2 之前启动Thread1,也不能保证线程将按顺序执行工作。它可能工作一次,它可能在另一次工作。

有几个选项可用于同步线程,请查看

  • msdn 上的线程同步
  • 第2部分:约瑟夫·阿尔巴哈里的基本同步
  • 也许,任务链会很有趣

通过在clientsocketservice类中添加一个新的ClientConnected事件处理程序并订阅它,我解决了这个问题。

现在,我将 ClientSocketService 对象添加到调用 ClientConnectedEventHandler 时的列表。这样,我可以在将客户端添加到列表之前执行其他一些初始化/授权工作。

感谢大家的帮助。