Jump to content

voltar a correr uma thread


jintonico
 Share

Recommended Posts

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

Link to comment
Share on other 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...

Link to comment
Share on other 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:  👍

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

Link to comment
Share on other sites

Basicamente estavas a ter problema em reinventar a roda  👍

Para resolver a tua questão podias ter utilizado uma Thread do ThreadPool 😄 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 😉

Daniel Amorim

VP for xRTML

http://www.xrtml.org http://www.realtime.co

Link to comment
Share on other 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...  👍   as threads tornam o debug das aplicações um pesadelo (pelo menos no VS 2005).

Link to comment
Share on other sites

Entretanto aqui fica o meu conselho: fujam das threads como o diabo foge da cruz...  👍   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 😄

Daniel Amorim

VP for xRTML

http://www.xrtml.org http://www.realtime.co

Link to comment
Share on other 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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.