• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jintonico

voltar a correr uma thread

10 mensagens neste tópico

Boas:

Tou a iniciar-me nesta coisa das threads e tou aqui com uma dúvida provavelmente existencial:  :wallbash:

                    
                    mail = new Thread(new ThreadStart(this.enviaMail));
                    mail.IsBackground = true;
                    mail.Start();

Quando este código é corrido, o método enviaMail é executado, e após a sua execução ele esta thread fica em memória.

Se eu quiser voltar a correr esta thread, como e q faço?

Basta voltar a chamar o método?

tks in advance

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens que criar um novo objecto Thread, e sobre esse fazer Start.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tive a pesquisar mais um bocado, encontrei que não era possivel fazer o q pretendo... Uma thread dpois de terminar a sua execução não pode voltar a ser executada (a mesma thread).

Tens que criar um novo objecto Thread, e sobre esse fazer Start.

Já tinha pensado nisso, mas assim fico com um possivel problema: dpois da execução da thread, ela fica em memoria, mm adormecida? Ou quando ela termina a sua execução "simplesmente" desapareçe?

Se for este ultimo caso fico com o meu problema resolvido, senão vou ter q arranjar outra solução...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fica em memória o objecto Thread, mas não fica em execução. O objecto só desaparecerá quando for executado o Garbage Collector.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelas dicas.

Entretanto para resolver o meu problema do mail (sempre que enviava um mail o programa parava durante um bocado) acabei por utilizaras operações assincronas que o SmtpClient disponibilizava, assim posso somente chamar o método e n preciso de me procupar com o resto.

O código ficou qq coisa deste genero:

           System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient(servidorSMTP, porta);

            try
            {
                sc.SendCompleted += new SendCompletedEventHandler(sc_SendCompleted);

                sc.SendAsync(mm, null);
            }
            catch (Exception e)
            {
                this.SetText(e.Message);
            }

     ("..................................")

        void sc_SendCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Cancelled)
                this.SetText("\nEnvio do mail cancelado\n");
            else if (e.Error != null)
                this.SetText("\nErro: " + e.Error.ToString() + "\n");
            else
                this.SetText("\nMail enviado\n");
        }

Os créditos vão para aqui:  :thumbsup:

http://olondono.blogspot.com/2008/02/sending-mail-using-smtpclient.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Basicamente estavas a ter problema em reinventar a roda  :thumbsup:

Para resolver a tua questão podias ter utilizado uma Thread do ThreadPool :D Assim não te tinhas de preocupar com a gestão do ciclo de vida da Thread, seria o ThreadPool a fazer isso. O ThreadPool está optimizado para ter sempre disponível, a não se que atinjas o limite de Threads possíveis, e deste modo é minimizado o tempo de criação de uma Thread e evitado que haja colecta de objecto desncessáriamente.

A solução por ti implementada acaba por internamente utilizar o ThreadPool ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado... da próxima vez que necessitar de utiliza-las vou pegar por ai... conhecimento teorico sobre isto nunca e dmais (já dizia um prof meu: não há nada mais prático do que uma boa teoria)

Entretanto aqui fica o meu conselho: fujam das threads como o diabo foge da cruz...  :thumbsup:  as threads tornam o debug das aplicações um pesadelo (pelo menos no VS 2005).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Entretanto aqui fica o meu conselho: fujam das threads como o diabo foge da cruz...  :thumbsup:  as threads tornam o debug das aplicações um pesadelo (pelo menos no VS 2005).

Não penses assim  ;)  É verdade que o desenvolvimento de aplicações multithreading tem maior dificuldade pois é necessário um role de preocupações que não existiam nas aplicações singlethread, mas hoje em dia não há como fugir do multithread! É necessário aproveitar os recursos computacionais disponíveis ao máximo e isso apenas conseguimos com mais que um fio de execução a correr em simultâneo :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Multithreading é o futuro. Dentro de não muito tempo quem tiver bons conhecimentos de programação concorrente estará garantido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Multithreading é o futuro. Dentro de não muito tempo quem tiver bons conhecimentos de programação concorrente estará garantido.

Concordo plenamente!!   :)

Uma das pesquisas que fiz foi de como fazer debug a uma aplicação multithread, e deparei-me com várias mensagens de pessoal a queixar-se do facto de não ser muito fácil fazer o debug neste tipo de aplicações no VS 2005 e que no 2008 era bastante mais fácil.

Para que usa, como e q fazem debug deste tipo de aplicações no VS2005? Através do freeze e thaw? (as vezes a aplicação tinha um comportamento estranho) Ou existe outro modo? Eu utilizei isto juntamente com uns consoles.writelnes

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora