具有backgroundWorker的C#TCP客户端

具有backgroundWorker的C#TCP客户端,c#,tcp,backgroundworker,C#,Tcp,Backgroundworker,我有一个用C#编写的TCP客户机,我使用backgroundWorker连接服务器,如下所示: void ConnectToServer() { try { bwConnector = new BackgroundWorker(); bwConnector.DoWork += new DoWorkEventHandler(bwConnector_DoWork); bwConnector.RunWorkerCompleted = new Ru

我有一个用C#编写的TCP客户机,我使用backgroundWorker连接服务器,如下所示:

void ConnectToServer() {
    try {
        bwConnector = new BackgroundWorker();
        bwConnector.DoWork += new DoWorkEventHandler(bwConnector_DoWork);
        bwConnector.RunWorkerCompleted = new RunWorkerCompletedEventHandler(bwConnector_RunWorkerCompleted);
        bwConnector.RunWorkerAsync();
        e.Result = true;
    } catch {
        e.Result = false;
    }
}

void bwConnector_DoWork(object sender, DoWorkEventArgs e) {

    clientSocket = new Socket(xxxxxx);
    clientSocket.Connect(xxxx);

    this.networkStream = new NetworkStream(this.clientSocket);
    this.bwReceiver = new BackgroundWorker();
    this.bwReceiver.DoWork += new DoWorkEventHandler(StartReceive);
    ........
}
void bwConnector_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {

    ((BackgroundWorker)sender).Dipose();
    if (!((bool)e.Result)) {
        Debug.Log("failed");
    } else {
        Debug.Log("success");
    }
}
我有一个计时器来检查
clientSocket.Connected
是否为真,如果为假,我将再次调用
ConnectToServer()
进行另一次连接尝试

问题是每次我关闭应用程序并重新打开它时,最后一个套接字似乎仍然存在,并且有两个具有相同IP但不同端口的套接字连接到服务器

甚至我也有这样的想法:

void ConnectToServer() {
    try {
        bwConnector = new BackgroundWorker();
        bwConnector.DoWork += new DoWorkEventHandler(bwConnector_DoWork);
        bwConnector.RunWorkerCompleted = new RunWorkerCompletedEventHandler(bwConnector_RunWorkerCompleted);
        bwConnector.RunWorkerAsync();
        e.Result = true;
    } catch {
        e.Result = false;
    }
}

void bwConnector_DoWork(object sender, DoWorkEventArgs e) {

    clientSocket = new Socket(xxxxxx);
    clientSocket.Connect(xxxx);

    this.networkStream = new NetworkStream(this.clientSocket);
    this.bwReceiver = new BackgroundWorker();
    this.bwReceiver.DoWork += new DoWorkEventHandler(StartReceive);
    ........
}
void bwConnector_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {

    ((BackgroundWorker)sender).Dipose();
    if (!((bool)e.Result)) {
        Debug.Log("failed");
    } else {
        Debug.Log("success");
    }
}
对于断开连接,我有这样的代码:

System.Net.NetworkInformation.NetworkChange.NetworkAvailablilityChanged += new System.Net.NetworkInformation.NetworkAvailabilityChangedEventHandler(NetworkAvailabilityChanged);
private void NetworkChange_NetworkAvailabilityChanged(object sender , System.Net.NetworkInformation.NetworkAvailabilityEventArgs e)
    {
        if ( !e.IsAvailable )
        {
            this.OnNetworkDead(new EventArgs());
            this.OnDisconnectedFromServer(new EventArgs());
        }
        else
            this.OnNetworkAlived(new EventArgs());
    }
...............
public event DisconnectedEventHandler DisconnectedFromServer;
protected virtual void OnDisconnectedFromServer(EventArgs e)
{
    if ( DisconnectedFromServer != null )
    {
        DisconnectedFromServer(this , e);
    }
}
...........
void StartReceive(xxxxxxxxx) {
    while (this.clientSocket.Connected) {
        .........
    }
    this.Disconnect();
}

bool Disconnect() {
    if (this.clientSocket != null && this.clientSocket.Connected) {
        try {
            this.clientSocket.Shutdown(SocketShutdown.Both);
            this.clientSocket.Close();
            return true;
        } catch {
            return false;
        }
    }
}
感谢您的帮助。

按照SO的建议在此处回复

不幸的是,现实世界中的应用程序往往会失败,而且往往会在意外事件发生时失败。被用户意外关闭可能是最明显的“意外事件”。我会确保,若并没有其他事情,至少在出口时所有东西都被清理干净了


最后,一切取决于您。

您在哪里关闭连接?我在问题中添加了一些代码,如果理解正确,谢谢;您打开一个连接->准备好接受数据的套接字->开始接收数据->关闭连接。这一切都很好,一切都井然有序。问题似乎是由计时器引起的,它在连接关闭时立即打开连接。因此,就在应用程序即将退出之前,计时器打开了一个从未关闭的连接。实际上,在正常情况下,我没有“关闭连接”,因为我不希望客户端主动断开与服务器的连接。我只希望客户端在服务器死机并重新打开时再次连接到服务器。这是可以理解的,但在退出应用程序之前,您需要注意最后一次关闭连接。禁用计时器->检查连接是否打开->如果打开关闭->优雅地退出