Saturday 3 March 2018

Valor de retorno do processo waitforexit


Processar o valor de retorno do waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Obter valor de retorno do processo.
Oi, estou tentando fazer o seguinte: eu tenho um processo que pode levar parâmetros (dígitos) e retornar a soma desses números.
Recebo o valor de retorno de "ExitCode". O problema é: o programa às vezes termina seu trabalho antes do processo, então quando o programa atinge essa linha.
Recebi uma exceção ... minha pergunta é como esperar esse processo até terminar seu trabalho, desculpe, eu esqueci de dizer que estou trabalhando com linguagem C #.

Processar o valor de retorno do waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Processo WaitForExit e obtenha o valor de retorno assíncrono.
Eu tenho uma função que inicia um processo, aguarda a saída e retorna o código de saída:
Isso está funcionando bem. Mas porque está à espera de Sair, bloqueia o Formulário de Janela (eu tenho uma Barra de Progresso do Marquee, que é conitnues em movimento e agora pára definitivamente). Não tenho ideia de como retornar o código de saída assíncrono e não consegui encontrar nenhuma solução possível que entendi.
Você pode usar este código:
Mas observe que a função de login irá sair diretamente depois de iniciar o processo para que você não possa retornar um valor inteiro. Você obtém o código de saída na função process_exited.
Você pode se registrar no evento Process. Exit e lidar com o código de saída lá.
E, em seguida, retornar o status de saída do método OnMyProcessExited.

Processo . Método WaitForExit (Int32)
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Instrui o componente Processo a aguardar o número especificado de milissegundos para que o processo associado saia.
Assembly: System (no System. dll)
Parâmetros.
A quantidade de tempo, em milissegundos, para aguardar o encerramento do processo associado. O máximo é o maior valor possível de um inteiro de 32 bits, que representa infinito para o sistema operacional.
Valor de retorno.
é verdade se o processo associado tenha saído; caso contrário, falso.
A configuração de espera não pôde ser acessada.
Nenhum Id do processo foi configurado e um identificador do qual a propriedade Id pode ser determinada não existe.
Não existe nenhum processo associado a este objeto Processo.
Você está tentando chamar WaitForExit (Int32) para um processo que está sendo executado em um computador remoto. Este método está disponível somente para processos que estão sendo executados no computador local.
WaitForExit (Int32) faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Esse método instrui o componente Processo a aguardar um período finito de tempo para o processo sair. Se o processo associado não sair pelo final do intervalo porque a solicitação de término é negada, o falso é retornado ao procedimento de chamada. Você pode especificar um número negativo (Infinito) por milissegundos e Processar. WaitForExit (Int32) irá comportar-se da mesma forma que a sobrecarga WaitForExit (). Se você passar 0 (zero) para o método, ele retorna verdadeiro somente se o processo já foi encerrado; Caso contrário, ele retorna imediatamente falso.
No Quadro 3.5 e versões anteriores, se o milissegundo fosse -1, a sobrecarga WaitForExit (Int32) esperava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente.
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento de eventos assíncrono tenha sido concluído, chame a sobrecarga WaitForExit () que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga. Para ajudar a garantir que o evento Exited seja tratado corretamente nas aplicações Windows Forms, defina a propriedade SynchronizingObject.
Quando um processo associado é encerrado (é encerrado pelo sistema operacional através de uma terminação normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (Int32). O componente Processo pode acessar a informação, que inclui o ExitTime, usando o Handle para o processo encerrado.
Como o processo associado saiu, a propriedade Handle do componente já não aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de manipulações para processos que não foram lançados pelos componentes do Processo, portanto, mantém as informações ExitTime e Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que você ligar para uma instância do Start for Process, chame Close quando o processo associado for encerrado e você não precisa mais de informações administrativas sobre isso. Fechar libera a memória alocada para o processo encerrado.
Consulte o exemplo de código para a propriedade ExitCode.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Processo WaitForExit e obtenha o valor de retorno assíncrono.
Eu tenho uma função que inicia um processo, aguarda a saída e retorna o código de saída:
Isso está funcionando bem. Mas porque está à espera de Sair, bloqueia o Formulário de Janela (eu tenho uma Barra de Progresso do Marquee, que é conitnues em movimento e agora pára definitivamente). Não tenho ideia de como retornar o código de saída assíncrono e não consegui encontrar nenhuma solução possível que entendi.
Melhor Como:
Você pode usar este código:
Mas observe que a função de login irá sair diretamente depois de iniciar o processo para que você não possa retornar um valor inteiro. Você obtém o código de saída na função process_exited.
Enquanto o estilo Herdar no WPF afeta o estilo pai.
Se você declarar um estilo sem uma chave x: ele substituirá o estilo padrão desse controle. & lt; Style TargetType = "local: CustomControl" & gt; Portanto, o código acima afetará todos os elementos do CustomControl em toda a aplicação (ou dentro do escopo). Se você não quer substituir o estilo base, pode dar o seu.
MvcSiteMapProvider - Menu suspenso do bootstrap aprimorado.
node. Descendants deve ser node. Children Saiba a diferença em Descendants and Children aqui, CSS Child vs Descendant seletores (Nunca se preocupe com a publicação sobre CSS, este é um padrão genérico).
Regex que permite a parte fracionada vazia do número.
Basta obter o ponto fora do grupo captruing e, em seguida, torná-lo como opcional. @ "[+ -]? \ d + \.? \ d *" Use âncoras, se necessário. @ "^ [+ -]? \ d + \.? \ d * $".
Alinhando StackPanel para o centro do topo em Canvas.
Se você não quer qualquer entrada ou acerte o teste em um determinado elemento, você deve configurar a propriedade IsHitTestVisible como falso: & lt; Grid & gt; & lt; Canvas Name = "Canvas" Background = "# EFECCA" & gt; & lt; DockPanel VerticalAlignment = "Stretch" HorizontalAlignment = "Stretch" Width = "" Height = "" MouseLeftButtonDown = "DockPanel_MouseLeftButtonDown" TouchDown = "DockPanel_TouchDown" Panel. ZIndex = "2" Background = "Transparent" & gt; & lt; / DockPanel & gt; & lt; Button Width = "50" Height = "50".
System. http. formatting causando problemas com o Newtonsoft. json.
A etiqueta assemblyBinding possui um esquema xmlns adequado? Verifique se o problema que está encontrando é o mesmo que o redirecionamento de vinculação de montagem não funciona.
C # - Não é possível conectar-se ao servidor MySQL remoto.
Ao se conectar a um banco de dados MySQL, usei sempre o MySQL Connector, você pode chegar aqui: dev. mysql / downloads / connector / net / 6.9.html Você precisa importar os namespaces MySQL para o seu projeto e então você pode usar o MySQLConnection em vez de o SQLConnection que é, até onde eu sei, apenas para servidores MSSQL. codeproject / Dicas / 423233 / How-to-Connect-to-MySQL-Using-Csharp.
É possível concatenar um valor DataBound com uma string constante no XAML DataBinding?
Você pode usar um StringFormat em sua vinculação, assim: & lt; TextBox Text = "Item:>" / & gt; Dito isto, pode causar algum comportamento inesperado ao editar. Por exemplo, se o usuário edita apenas o nome do item (excluindo o texto 'Item:'), então, quando o TextBox perder o foco, o formato da string será.
SQL Server / C #: Filtro para System. Date - entradas de resultados apenas às 00:00:00.
O que acontece se você alterar todos os filtros para usar 'LIKE': if (DropDownList1.SelectedValue. ToString (). Igual ("Iniciar"))% '", TextBox1.Text);> Então, você não está combinando contra uma data exata (à meia-noite), mas combinando qualquer data-hora que comece com essa data. Atualização ou talvez você possa tentar isso. Se (DropDownList1.SelectedValue. ToString (). Igual ("Iniciar")).
Casting de parâmetros de tipo sem restrições.
O compilador vê os identificadores T2 e T e informa-o de forma útil que esses tipos parecem não relacionados. Isso é absolutamente correto, pois eles não têm nenhuma relação: não há restrições genéricas que afirmariam qualquer relação entre eles (não estou dizendo que isso seria útil aqui, porém :)). Se este.
C # PCL HMACSHAX com BouncyCastle-PCL.
Como posso determinar se um objeto de tipo anônimo está vazio?
Os tipos anônimos não fornecem sobrecargas do operador para ==, embora não seja importante neste caso, uma vez que um dos argumentos é um objeto digitado. No entanto, o compilador C # fornece implementações Equals, GetHashCode e ToString. Use o método static. Equals, método que fará as verificações nulas apropriadas e depois chamará.
Não é possível encontrar o banco de dados criado automaticamente.
Se você não especificar um nome de banco de dados, a conexão usará o banco de dados padrão para o usuário, neste caso, é segurança integrada, então é o seu login do Windows. Como você provavelmente terá o administrador completo do sistema no servidor, o banco de dados padrão será mestre, então você encontrará tudo.
Carregue XML para listar usando LINQ [duplicado]
Faça uma classe base que terá id, x, y, z e que os Fornecedores, Banqueiros e Hospitais o estendam. Então você pode ter uma coleção da classe base, e adicionar a ela as classes que herdam dela.
Código C # / classes separadas para cada TabControl.
Coloque um UserControl em cada guia.
Colete cordas depois de um loop foreach.
Sim, você precisa fazer a adição no loop. Eu usaria uma lista & lt; string & gt; como ele suporta LINQ: XmlNodeList skillNameNodeList = SkillXML. GetElementsByTagName ("nome"); Lista & lt; string & gt; skills = new List & lt; string & gt; (); foreach (XmlNode skillNameNode em skillNameNodeList).
Valide apenas um campo se for preenchido.
Atualize a lista de itens em c #
Eu faria algo como isto: (para listas de ordenação) // a lista atual var currentList = new List & lt; Employee & gt; (); currentList. Add (novo Empregado); currentList. Add (novo Empregado); // nova lista var newList =.
Verifique se o arquivo é imagem.
Você não pode fazer isso: string. Contains (string array) Em vez disso, você precisa reescrever essa linha de código para isso: if (file == null || formats. Any (f = & gt; file. Contains (f))) E isso pode ser encurtado para: if (file == null || formats. Any (file. Contains)).
Diferença entre aplicações e módulos de gasodutos em Nancy?
As encanamentos de módulos e aplicações são explicadas em detalhes na wiki. É basicamente ganchos que são executados antes e depois da execução da rota em uma rede global (pipelines de aplicativos) e por módulo. Aqui está um exemplo: se uma rota for resolvida para um módulo chamado FooModule, as tubulações serão invocadas como.
Registrar tipo de retorno.
Se você conhece o tipo na inicialização, basta derivar a classe: public class UserLogin: GenericLogin & lt; ABC01_REGISTERED_USER & gt; Então use essa classe o tempo todo. Caso contrário, você deve fornecer o nome do tipo sempre, pois não pode saber que deseja usar esse tipo de vez em quando.
Chave estrangeira em C #
Você quer criar uma relação em duas tabelas Consulte este link c-sharpcorner / Blogs / 5608 / create-a-relationship-between-two-dataset-tables. aspx.
Como forneço uma coleção de elementos a uma propriedade anexada personalizada?
Por que a tarefa não é cancelada quando eu chamo o método CancelarTokenSource Cancelar no método async?
O cancelamento é cooperativo. Isso significa que aquele que detém o CancelamentoTokenSource e a pessoa que está segurando o CancelamentoToken precisa verificar se o cancelamento foi sinalizado (seja por votação do cancelamento ou pelo registro de um delegado para ser executado quando é sinalizado). Na sua tarefa. Você pode usar o.
Obter objeto por valor de atributo [duplicado]
Se você obteve o Assembly, você pode simplesmente iterar sobre os tipos e verificar suas condições: var matchingTypes = de t in asm. GetTypes () onde! T. IsInterface & amp; & amp; ! t. IsAbstract onde typeof (ICustomInterface).Is AssignableFrom (t) deixa foo = t. GetCustomAttribute & lt; FooAttribute & gt; () onde foo! = null & amp; foo. Bar == Y selecione t; Eu suponho que você quer.
Exporte os dados da tabela em Pervasive.
Não, não há como exportar dados de forma programática através do assistente "Exportar Dados" no Centro de Controle Pervasivo. Você precisaria escrever ou escrever um módulo de exportação.
Como retornar o resultado ao aplicar separação de consulta de comando (CQS)
Como enviar Ctrl + S através do método SendKeys. Send () para salvar um arquivo (salvar como diálogo)
Eu acredito que você precisa usar: SendKeys. SendWait ("^ (s)"); Em vez de: SendKeys. SendWait ("^% s?"); Dê uma olhada em msdn. microsoft/en-us/library/system. windows. forms. sendkeys. send(v=vs.110).aspx para obter mais informações.
Múltiplos tópicos pesquisando na mesma pasta ao mesmo tempo.
Em vez de usar uma instrução foreach comum ao fazer sua pesquisa, você deve usar o linq paralelo. O linq paralelo combina a simplicidade e a legibilidade da sintaxe do LINQ com o poder da programação paralela. Assim como o código que tem como alvo a Task Parallel Library. Isso irá protegê-lo de manipulação de linha de baixo nível e.
Chamada do método de chamada de sincronização do retorno de chamada Async?
As devoluções de retorno são independentes, uma vez que são invocadas nos trabalhos de finalização do IO. Se você estiver interessado, você pode ver isso no código-fonte. Esse método específico é para a classe Socket (que TcpClient e UdpClient usam internamente), onde o IO sobreposto é usado para invocar o retorno de chamada (veja o comentário em.
Tempo de data de conversão para IST.
Você precisa usar "India Standard Time" em vez de "Indian". Consulte este link para obter uma lista das descrições do fuso horário.
Visual Studio Assembly force-instala o Target Framework.
A versão segmentada é a única versão pela qual o aplicativo dependerá por padrão. O Visual Studio não adicionará automaticamente lançamentos compatíveis mais altos e atrasados. Faça isso manualmente adicionando outras versões a um arquivo de configuração: Na barra de menu do Visual Studio: Escolha Projeto; Adicionar novo item;.
Como faço para executar C # dentro de um aplicativo de servidor Node. js?
Tenho ideia do seu problema. U pode escrever o aplicativo de console c # e depois chamá-lo de nodejs. Você pode ver esta url Executar um arquivo exe usando node. js. Depois de c # trabalho escrever todos os dados para o banco de dados, você pode olhar para esta tabela, lida dele.
Erro ao criar um documento XDocument.
Você pode ignorar praticamente todo seu código, o problema é apenas isso: XDocument people = new XDocument ("Pessoas"); Você não pode criar um XDocument contendo uma string, você precisa adicionar um elemento: XDocument people = new XDocument (novo XElement ("Pessoas", original. XPathSelectElements (xpathFilterDups))); .
O índice estava fora do alcance. Deve ser não negativo ou menor do que o tamanho da coleção [duplicado]
Parece que você tem um erro de digitação na condição do seu loop: para (int index = filePaths. Count (); filePaths. Count () & gt; 9; index--) Ele deve ser para (int index = filePaths. Count () - 1; index & gt; 9; index--) Observe também que, para a primeira iteração do loop, você está tentando acessar o arquivo FilePaths [filePaths. Count ()] que é.
Como declarar o tipo de dados var em âmbito público em c #?
Declare-o como um tipo conhecido (não um tipo anônimo), como este por exemplo: Dictionary & lt; int, string & gt; results = new Dictionary & lt; int, string & gt; (); Então você pode armazenar os resultados no Dicionário: results = behzad. GAPERTitles. ToDictionary (x = & gt; x. id, x = & gt; x. gaptitle); E faça referência mais tarde: private void button1_Click (object sender, EventArgs e)
Consumo de memória ao encadear métodos de string.
É verdade que quando você encadeia funções de string, cada função instancia uma nova string? Em geral, sim. Toda função que retorna uma seqüência modificada faz isso criando um novo objeto de seqüência de caracteres que contém a nova string completa que é armazenada separadamente da string original. Tem.
Mostrar / ocultar tinymce com botões de rádio.
Você está faltando um @symbol para o atributo id: Modifique seu script também assim: *** EDITAR algo parece estar fora dos botões de rádio, apenas um deve ser verificado e eles devem ter o mesmo nome ** você pode usar o # para denote e ID em Jquery pelo.
Verifique a exceção de simultaneidade no EF6 para alterar a mensagem para ser mais amigável.
Você está executando um método assíncrono. Isso significa que qualquer exceção será lançada quando você ligar aguardar na tarefa retornada ou quando você tentar recuperar os resultados aguardando myTask; Você nunca faz isso, o que significa que a exceção é lançada e alcançada em sua chamada.
Classe ConfigurationProvider - deve ser no projeto DAL ou BLL?
Eu não concordo que há uma camada certa para você colocar essa classe desde que você lê valores do arquivo de configuração com base nas chaves fornecidas e pode ser necessário por uma ou todas as camadas. No caso de todas as camadas que usam esta classe, você pode.
Como posso adicionar uma coluna ao objeto IQueryable e modificar seus valores.
Exemplo simples para usar uma classe não anônima. classe pública MyLovelyClass public bool Selection> var packs = de r no novo XPQuery & lt; Roll & gt; (sessão) selecione novo MyLovelyClass (); gcPack. DataSource = packs; .
DialogBox com verificações de valor.
O problema é que você está tentando ativar ou desativar o botão ao verificar caixas de texto individuais e eles estão em conflito um com o outro, em vez disso, a lógica precisa estar em um nível superior. Altere sua função de validação de caixa de texto para retornar um bool e use isso em ValidateAll para determinar se ou não.
Marshal struct em struct de c # para c ++
Altere isso: [MarshalAs (UnmanagedType. ByValTStr, SizeConst = 36)] private string iu; para isso: [MarshalAs (UnmanagedType. LPStr)] private string iu; Observe que este código é bom apenas para passar uma seqüência de caracteres na direção C # - & gt; C ++. Para a direção oposta (C ++ - & gt; C #) é mais complexo, porque C # não pode facilmente desalocar a memória alocada C ++. Outra coisa importante.
Como fazer o formulário herdado em tela cheia [em espera]
Você deve decidir: ou maximizar o formulário (o que sempre garante que o TaskBar ainda esteja visível) ou configure as dimensões manualmente. Sugiro que você remova a linha WindowState. Outra maneira de segurança seria esconder o TaskBar do seu código, por exemplo, como descrito aqui.
Regex para remover `.` de uma sub-string entre colchetes.
Para remover todos os pontos presentes dentro dos colchetes. Regex. Replace (str, @ "\. (? = [^ \ [\]] * \])", ""); DEMO Para remover ponto ou? Regex. Replace (str, @ "[.?] (? = [^ \ [\]] * \])", ""); .
Converta os conteúdos de uma XmlNodeList para um novo XmlDocument sem looping.
Se você está feliz em convertê-lo em LINQ para XML, é realmente simples: XDocument original =. ; // No entanto, você carrega o documento original // Separado para maior clareza - pode ser embutido, é claro, seqüência de caracteres xpath = "// Pessoa [não (PersonID = seguinte :: Pessoa / PessoaID]]" XDocument people = new XDocument (novo XElement ("Pessoas", original. XPathSelectElements (xpath)).
C # MySQL Parameters. AddWithValue.
Você tenta adicionar todos os seus parâmetros 52 e seus valores com um método AddWithValue. Você não pode fazer isso. Em primeiro lugar, você precisa definir todos os seus parâmetros em seu comando com os nomes das suas colunas como; commandmandText = "INSERT INTO tb_mitarbeiter (Vorname, id, projectnummber.) VALUES (? nome,? id,? projektnummer.)"; Então.
C # XML: System. InvalidOperationException.
É "Informações do usuário" e "Dados do curso" é uma entidade diferente. Se assim for, acho que você pode encapsulá-los em uma entidade. XmlTextWriter writer = novo XmlTextWriter (caminho, System. Text. Encoding. UTF8); writer. WriteStartDocument (true); writer. Formatting = Formatting. Indented; writer. Indentation = 4; writer. WriteStartElement ("My Entity"); / * É um maior * / writer. WriteStartElement ("User Info"); writer. WriteStartElement ("Nome"); writer. WriteString (userName); writer. WriteEndElement (); writer. WriteStartElement ("Tutor.
implantação de um site asp e iis.
Existem vários provedores de domínio como: godaddy, nome etc, você pode usar para comprar um nome de domínio. Esses provedores também fornecem etapas para mapear o nome de domínio para o seu site. Confira este link, por exemplo. Este link explica a configuração do nome de domínio em detalhes.
Como personalizar a instalação do Visual Studio.
Você pode usar um projeto Microsoft Setup ou WIX (facilmente integrar com o Visual Studio). Ambos são gratuitos. • Você pode fazer quase toda a sua personalização no projeto de instalação, adicionando ações personalizadas. • WIX (janela instalador xml) é a melhor opção. Você pode fazer uma personalização completa do wix, mas sim.

Process. WaitForExit () retorna a exceção de referência nula.
Quando eu recupero jpg e outros arquivos de imagem do banco de dados (também alguns mp3 que abrem com winamp - que é configurado como o aplicativo padrão) parece que ele retorna um valor nulo, fazendo com que uma Exceção de Referência Nula seja acionada e o programa falhará (Graças a Deus pelo Try-Catch!). Eu mencionei por algum tempo e descobri que o processo que se chama é o dllhost. exe.
No entanto, ele retorna nulo. Agora, se eu alterar o aplicativo padrão que um arquivo está usando para abri-lo, ele funciona bem.
O problema é que não quero alterar as aplicações padrão, uma vez que o aplicativo que estou desenvolvendo será instalado em vários PC diferentes, com diferentes usuários e preferências diferentes.
Abaixo está o código que eu uso para recuperar e abrir os arquivos.
Estou um pouco perdido aqui e eu realmente poderia usar sua ajuda.
Sinta-se à vontade para solicitar quaisquer detalhes que possam ajudar.
Agradeço antecipadamente.
Facebook Twitter LinkedIn experts-exchange / questions / 27883967 / Process-WaitForExit-returns-null-reference-exception. html copy.
Para fazer perguntas e encontrar soluções.
Tony (8 comentários)
Obtenha recuperação rápida de itens individuais do SharePoint.
Ferramenta gratuita - Veeam Explorer para Microsoft SharePoint, permite restaurações rápidas e fáceis de sites, documentos, bibliotecas e listas do SharePoint - tudo sem agentes para gerenciar e sem licenças adicionais para comprar.
existe o problema porque o valor de Process () é nulo. ele lança uma exceção de referência nula.
porque "myProcess" está vazio (nada, nulo)
quanto ao atraso. como eu posso fazer isso ?
Agradeço antecipadamente.
para atrasar durante 0,5 segundos a execução. Nas imagens funciona bem, também desde que o fiel é carregado na memória, o aplicativo exclui o arquivo temporário do disco rígido. O único problema agora é os arquivos mp3 que abrem com o Winamp como o aplicativo padrão. Desde a transmissão, o arquivo não pode ser excluído. Preciso encontrar um trabalho para isso (a menos que outro jogador seja usado).
Como afirmado anteriormente, como posso codificar o Windows Photo Viewer no meu aplicativo (para incorporá-lo)?
Comentário de encerramento do autor.
Publicação destacada.
Ferramenta gratuita: ZipGrep.
O ZipGrep é um utilitário que pode listar e pesquisar arquivos zip (.war,.ear,.jar, etc.) para padrões de texto, sem a necessidade de extrair o conteúdo do arquivo.
Se você tiver um problema semelhante, faça uma pergunta relacionada.
Cursos sugeridos.
594 membros fizeram perguntas e receberam soluções personalizadas nos últimos 7 dias.
Junte-se à comunidade de 500 mil profissionais da tecnologia e faça suas perguntas.
Gostei da sua resposta?
Junte-se à nossa comunidade para obter mais soluções ou fazer perguntas.

No comments:

Post a Comment