Click here to Skip to main content
15,884,472 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
HI everyone...
when I close my application, it always stays with the active processes, each time I remove it from task manager, what do I do?

this is class listen
C#
class Listener
    {
        
        public delegate void lbconnection(string lbconnection);
        public lbconnection lbc;
        Thread thdsHandler;
        public int lport;
        public string lpath;
        
        //Le constructeur de la class Listener
        public Listener(int port,string path,lbconnection lbcc)
        {
            lbc=lbcc;
            lport = port;
            lpath = path;
        }
        public TcpClient handlerSocket;
        public TcpListener tcpListener;
        public void listenerThread()
        {
            //la port d'coute initialisé a 0   
            //int port = 0;
            //la creation de la class tcplistener 
            tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, lport)); 
            //le debut de l'ecoute on utilisant la methode start
            tcpListener.Start();
            //boucle infini while
            while (true)
            {
                //la method acceptsocket accept chaque client arrivé 
                handlerSocket = tcpListener.AcceptTcpClient();
                if (handlerSocket.Connected)
                {
                    lbc("Connected To Localhost :" + lport + " connected.");
                    //lbConnections.Items.Add("Connected To Localhost :" + lport + " connected.");
                    //lock pour ivite le blocage des clients
                    lock (this)
                    {
                        //alSockets.Add(handlerSocket);
                        Request rqs = new Request(lpath, handlerSocket);
                        //creation d'une thread appeler thdstHandler
                        thdsHandler = new Thread(new ThreadStart(rqs.handlerThread));
                        //thdHandler = new Thread(thdsHandler);
                        //le debut de travail de thread thdstHandler,on utilisant la methode start
                        thdsHandler.Start();
                    }
                }
            }
        }
        //procedure killthread
        public void killthread()
        {
         thdsHandler.Abort();
        }
    }


and the request class

C#
class Request
    {
        //public delegate void Desplaylist(string lv0, string lv1, string lv2, string lv3, string lv4);
        //Desplaylist ds;
        //int tcn = 0; int cc = 0; int sr = 0; int fr = 0; int mc = 0; int rs = 0;
        //public Thread thdHandler;
        //Listener lst;
        public string tbpath;
        public TcpClient tcpclient;
        public Request(string tbpath, TcpClient tcpclient)
        {
           this.tbpath = tbpath;
           this.tcpclient = tcpclient;  
        }
        

        public struct serverinfo
        {
            public string httpversion;
            public string Date;
            public string sinfo;
            public string AcceptRanges;
            public string ContentLength;
            public string Connection;
            public string ContentType;
        };

        // la procedure handleThread fait le traitement de requette arrivé de client 
        public void handlerThread()
        {
            //tcn++;
            //lbConnections.Items.Add("Server Started");
            byte[] clientData = new byte[1024];
            //initialisation d'une socket appele handlesocket 
            //Socket handlerSocket = (Socket)alSockets[alSockets.Count - 1];
            String filename = "";
            String[] verbs;
            NetworkStream ns = tcpclient.GetStream();
            ns.Read(clientData, 0, clientData.Length);
            //handleSocket.Receive(clientData);
            //maitre la requette recus dans un fichier text
            string stringdata = Encoding.ASCII.GetString(clientData);
            File.WriteAllText(tbpath + "\\Request.txt", stringdata);
            verbs = stringdata.Split(" ".ToCharArray());
            // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            filename = verbs[1].Replace("/", "\\");
            if (filename.IndexOf("?") != -1)
            {
                // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                filename = filename.Substring(0, filename.IndexOf("?"));
            }
            if (filename.EndsWith("\\"))
            {
                // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                filename += "index.html";
            }
            filename = tbpath + filename;
            if (!File.Exists(filename))
            {
                //fr++;
                filename = tbpath + "\\Page Not Found.html";
            }
            //if (filename != "\\Page Not Found.html")
            //{
            //    sr++;
            //}
            //ds(Convert.ToString(tcn), Convert.ToString(cc), Convert.ToString(sr), Convert.ToString(fr), Convert.ToString(mc));
            //creation d'une nouvelle class filestream appele fs ouvrir ou cree le fichier ou lien filename
            FileStream fs = new FileStream(filename, FileMode.Open);
            //pointe sur le depart de string 
            fs.Seek(0, SeekOrigin.Begin);
            byte[] fileContents = new byte[fs.Length];
            //Maitre le contenu de (les bites) dans la variable filecontents
            fs.Read(fileContents, 0, (int)fs.Length);
            fs.Close();
            //envoy la reponce ou client on utilisons la methode Send 
            ns.Write(fileContents, 0, fileContents.Length);
            //handleSocket.Send(fileContents);
            serverinfo sinfo = new serverinfo();
            sinfo.httpversion = "HTTP/1.1 200 OK \r\n";
            sinfo.Date = "Dtae: ";
            sinfo.sinfo = "Server: HTTPServer/1 (Windows) HTTP/1.1 \r\n";
            sinfo.AcceptRanges = "Accept-Ranges: bytes \r\n";
            sinfo.ContentLength = "Content-Length: 1564 \r\n";
            sinfo.Connection = "Connection: Close \r\n";
            sinfo.ContentType = "Content-Type: text/html \r\n";
            string servinfo = sinfo.httpversion + sinfo.Date + DateTime.Now.Date + "," + DateTime.Now.Month + " " + DateTime.Now.Year + "  " + DateTime.Now.Hour + " " + DateTime.Now.Minute + " "
                + DateTime.Now.Second + "\r\n" + sinfo.sinfo + sinfo.AcceptRanges + sinfo.ContentLength + sinfo.Connection + sinfo.ContentType + "\r\n" + Encoding.ASCII.GetString(fileContents);
            File.WriteAllText("C:\\www\\Reponse.txt", servinfo);
            //lbConnections.Items.Add(filename);
            //arreté la socket
            ns.Close();
            //handleSocket.Close();
            //procedute killthread qui tue le Thread
            //lst.killthread();
        }
    }


and the click bouton

C#
private void btnStart_Click(object sender, EventArgs e)
        {

            tbPort.ReadOnly = true;
            tbPath.ReadOnly = true;
            //la creation d'une list des socket
            int port = 0;
            port = Convert.ToInt16(tbPort.Text);
            string path = tbPath.Text;
            //alSockets = new ArrayList();
            Listener lst = new Listener(port, path, this.lbconnect);
            //creation d'une thread appeler thdlistener
            thdListener = new Thread(new ThreadStart(lst.listenerThread));
            //le debut de travail de thread...on utilisant la methode start
            thdListener.Start();

            ////////////////////////////////
            btnStart.Enabled = false;
            Resume.Enabled = false;
            Suspend.Enabled = true;
            Stop.Enabled = true;
        }


this is my work and i need to explain me the wrong ...
Posted
Updated 24-Apr-11 7:51am
v2
Comments
Sergey Alexandrovich Kryukov 24-Apr-11 13:52pm    
I vote 1 for "remove application from processes". You don't want to "remove" any process, ever!
You need to fix the bug though...
--SA

Do you have secondary threads that may still be alive? (if they are foreground threads, all of them need to terminate before the process terminates)

[Update]
-----------

Just an update. From the comments OP made, this was indeed the issue. He had to mark the threads as background threads and that fixed his problem.
 
Share this answer
 
v3
Comments
guendouz bachir 23-Apr-11 10:48am    
yes i use thread in my aplication... what can i do?
Nish Nishant 23-Apr-11 10:50am    
I guess you could change them to be background threads (as opposed to foreground threads).
Nish Nishant 23-Apr-11 10:51am    
See http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx
guendouz bachir 23-Apr-11 11:01am    
an article explain it ? i will see msdn
Nish Nishant 23-Apr-11 11:03am    
Yeah, read up on the IsBackground link I gave above.
You do a bad thing: you create threads in loop. For networking, you need either one thread (on client side) or two threads on server side: one is accepting new connections (adding info on remote thread to some container), another thread execute data exchange protocol: read/write from/to network stream. Also, don't use lock — socket is itself a thread synchronization primitive. You need to create thread(s) from the very beginning and abort them when you close the application.

Also, if you use Thread.Abort, you must process ThreadAbortException.

The number of threads should be fixed.

See my answer to a similar question where I describe the skeleton of right design:
Multple clients from same port Number[^].

You never want to "remove application from Processes (Task Manager)"!
You problem is the application which is not finished due to pending thread(s). One solution could be using thread pool — the unfinished threads will not prevent your process from closing. This won't be a resolution of the code problem, which is in the logic of your thread life-time control. I don't want to look for your bug, because you design looks wrong. You need to address the design using my directions above.

—SA
 
Share this answer
 
Comments
Nish Nishant 24-Apr-11 14:06pm    
Voted 5.
Sergey Alexandrovich Kryukov 24-Apr-11 21:04pm    
Thank you, Nishant.
--SA
C#
Process[] Processes = Process.GetProcessesByName("name of process goes here");
            foreach (Process Proc in Processes)
            {
                Proc.Kill();
            }
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900