none
[RESOLVIDO] Programa chamado não finaliza o processo RRS feed

  • Pergunta

  • Olá amigos, 

    Tenho uma aplicação web que chama um aplicativo executável no servidor passando alguns parâmetros, e esse aplicativo devolve um arquivo em PDF para o usuário.

    Funciona perfeitamente, porém estou com um problema  que não consigo resolver.
    Algumas vezes, não sei dizer quando ocorre, quando o usuário faz a solicitação do arquivo e a aplicação chama esse aplicativo, o mesmo não mata o processo do aplicativo. O processo continua na aba de processos do task manager do servidor.

    Não é sempre que isso acontece, só algumas vezes ao dia. Mas isso não é bom, pois diminui a performance do servidor.

    Podem me ajudar a resolver essa situação ou me auxiliar no motivo do processo da aplicação não fechar após o uso?

    Obrigado!


    Cleverson Darsie


    quinta-feira, 24 de outubro de 2013 19:06

Respostas

  • Olá Romy, 

    Não precisei implementar o GC para conseguir a resolução do problema.
    Apenas inseri o trecho do código abaixo para resolver:

                        using (Process exeProcess = Process.Start(startInfo))
                        {
                            exeProcess.WaitForExit();
                            if (File.Exists(pag.Server.MapPath(res)))
                            {
                                pag.Response.ContentType = "application / pdf";
                                pag.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
                                FileStream sourceFile = new FileStream(pag.Server.MapPath(res), FileMode.Open);
                                long FileSize;
                                FileSize = sourceFile.Length;
                                byte[] getContent = new byte[(int)FileSize];
                                sourceFile.Read(getContent, 0, (int)sourceFile.Length);
                                sourceFile.Close();
                                pag.Response.BinaryWrite(getContent);
                                
                                if (!exeProcess.HasExited)
                                {
                                    exeProcess.Kill();
                                }
                            }
                        }
    Agora não fica nenhum processo aberto no servidor.

    Obrigado pela ajuda.


    Cleverson Darsie

    • Marcado como Resposta Cleverson Darsie terça-feira, 29 de outubro de 2013 13:34
    terça-feira, 29 de outubro de 2013 13:33

Todas as Respostas

  • Cleverson,

    Minha dica para você é usar um bloco de código do tipo "Using", pois ele libera recursos automaticamente através do método Dispose().

    Para maior entendimento segue em anexo o link abaixo:

    http://www.devmedia.com.br/entendendo-o-bloco-using-no-c/16967

    Espero ter ajudado, Bons Estudos !


    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 24 de outubro de 2013 23:50
  • Olá Jean Carlos, 

    Eu já utilizo o bloco using no meu código, como você pode ver abaixo:

                        using (Process exeProcess = Process.Start(startInfo))
                        {
                            exeProcess.WaitForExit();
                            if (File.Exists(pag.Server.MapPath(res)))
                            {
                                pag.Response.ContentType = "application / pdf";
                                pag.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
                                FileStream sourceFile = new FileStream(pag.Server.MapPath(res), FileMode.Open);
                                long FileSize;
                                FileSize = sourceFile.Length;
                                byte[] getContent = new byte[(int)FileSize];
                                sourceFile.Read(getContent, 0, (int)sourceFile.Length);
                                sourceFile.Close();
                                pag.Response.BinaryWrite(getContent);
                            }
                            else
                            {
                                throw new Exception("DLRB não retornou arquivo de resultado.");
                            }
                        }

    Acredito que não seja esse o problema. De uma analisada, por favor, e me diga se há alguma outra coisa que posso fazer.

    Obrigado.


    Cleverson Darsie

    sexta-feira, 25 de outubro de 2013 11:16
  • Cara já experimentou a class GC.

    public class produtosController : Controller , IDisposable
    {
    #region Implementação do IDisposable
        //Implement IDisposable.
        public void Dispose()
        {
          Dispose(true);
          GC.SuppressFinalize(this);
        }
    
        protected virtual void Dispose(bool disposing)
        {
    
        }
    
        ~produtosController()
        {
          Dispose(false);
        }
    
        public class Derived : EmbaixadorasController
        {
          protected override void Dispose(bool disposing)
          {
            base.Dispose(disposing);
          }
    
        }
        #endregion
    
    }

    Abraço!

    segunda-feira, 28 de outubro de 2013 14:52
  • Olá Romy, 

    Não precisei implementar o GC para conseguir a resolução do problema.
    Apenas inseri o trecho do código abaixo para resolver:

                        using (Process exeProcess = Process.Start(startInfo))
                        {
                            exeProcess.WaitForExit();
                            if (File.Exists(pag.Server.MapPath(res)))
                            {
                                pag.Response.ContentType = "application / pdf";
                                pag.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
                                FileStream sourceFile = new FileStream(pag.Server.MapPath(res), FileMode.Open);
                                long FileSize;
                                FileSize = sourceFile.Length;
                                byte[] getContent = new byte[(int)FileSize];
                                sourceFile.Read(getContent, 0, (int)sourceFile.Length);
                                sourceFile.Close();
                                pag.Response.BinaryWrite(getContent);
                                
                                if (!exeProcess.HasExited)
                                {
                                    exeProcess.Kill();
                                }
                            }
                        }
    Agora não fica nenhum processo aberto no servidor.

    Obrigado pela ajuda.


    Cleverson Darsie

    • Marcado como Resposta Cleverson Darsie terça-feira, 29 de outubro de 2013 13:34
    terça-feira, 29 de outubro de 2013 13:33