‫Bem-vindo de volta a este vídeo, vamos dar uma olhada nas tarefas e especificamente ao trabalhar com o UPF,
‫portanto, vamos criar um novo projeto e usar o WP F aqui e vou chamar um duplo.
‫Você tem tarefas.
‫E, no meu caso, vamos pressionar OK para criar esse projeto e, no meu conhecimento de IU, um botão.
‫E vou fazer isso por meio da caixa de ferramentas.
‫Então, vou selecionar um botão e arrastá-lo para minha IU para torná-lo um pouco
‫maior.
‫E vamos mudar o tamanho da fonte para 32, talvez algo assim.
‫Agora está um pouco mais fácil de ler e vou dar um nome.
‫O nome é igual ao meu botão porque quero usá-lo mais tarde no meu code-behind.
‫Tudo bem, então essa é a IU por enquanto.
‫Vamos adicionar um pequeno navegador da Web mais tarde, mas por enquanto, o botão vai funcionar.
‫E na minha janela principal, quero usar esse botão, mas preciso clicar no evento para isso.
‫Portanto, sempre que alguém clica nesse botão, quero fazer o download de algo da web e,
‫assim que terminar o download, quero atribuir o TEMEL ao texto do botão ao conteúdo do botão e, portanto, preciso de um evento
‫de clique.
‫Vou clicar duas vezes no botão e isso criará um novo evento my button click aqui.
‫Portanto, este método será acionado sempre que clicarmos no botão.
‫E a maneira mais fácil de ver se isso é verdade é apenas usar uma caixa de mensagem e dizer algo como oi
‫ou funcionou ou algo parecido.
‫Agora vamos executá-lo apenas para ver se nosso código realmente funciona, porque antes de qualquer coisa, vamos apenas salvar o botão
‫funciona e ele diz oi.
‫Tudo bem, tudo bem.
‫Agora, como você pode ver, o texto em si não é tão grande quanto o texto do botão.
‫Isso não é bonito, mas esse vídeo não é sobre isso, certo?
‫É sobre testes e baixar algo em segundo plano enquanto a IU não está travada.
‫Tudo bem.
‫Então, vamos encontrar uma maneira de travar.
‫Então, vamos tentar algo como fazer o download.
‫E para baixar algo, vou usar um cliente HTTP e vou chamar um cliente Web.
‫Agora, o cliente BTP é uma classe que temos que adicionar sistema.
‫E pensei em HTP, é disso que precisamos aqui.
‫Portanto, este cliente Web agora, será um novo cliente GTP da página.
‫E agora eu quero ter uma string, que será o HTML, que será o
‫cliente da Web, obterá uma string assíncrona e qual string deverá ficar bem deve receber a coluna https barra, barra,
‫Google dot com e eu quero tem o resultado disso.
‫Então baixe o site e me dê o resultado armazenado em HTML.
‫Então é isso que essa coisa fará.
‫Direito.
‫E o que vou ver é o tópico em que estou.
‫Quero ver o tópico em que estou trabalhando.
‫A linha direita será o número e o ponto da linha e, para usar a linha, precisamos fazer isso.
‫Use o encadeamento dublado do sistema e, para usar o Deba, precisamos usar o diagnóstico padrão do sistema.
‫Então, vamos fazer essas duas coisas e agora podemos ir em frente e obter o segmento atual e o ID do segmento
‫MENAGED.
‫Então, eu só quero saber o que fiz como um tópico que estou executando no momento.
‫Então, quando eu clicar no botão, esse debug será impresso e fará o download de algo.
‫Agora, digamos que eu queira alterar o conteúdo do botão, para que o meu botão use algo como pronto.
‫Então, vamos testar isso.
‫Aqui estamos.
‫Assim que clico no botão, você pode ver que está pronto.
‫Baixei e pronto.
‫E isso acontece porque este aqui, então o download da conta do Google funciona muito rápido, e é por isso
‫que é até possível fazer o conteúdo que o Ekwall fez, mas normalmente isso não deveria ser possível, ou na maioria dos
‫casos, não será possível , porque essa tarefa aqui geralmente demora um pouco.
‫E temos um tópico aqui que é bastante, sim, muito pesado, porque o download de coisas geralmente demora um pouco.
‫E exceto que é muito, muito pouco que estamos realmente baixando, neste caso, estamos apenas
‫baixando um site do Google ponto com, que é muito, muito curto.
‫São apenas alguns kilobytes.
‫Então, em vez disso, não vou baixar um arquivo de cinco megabytes.
‫Portanto, demora um pouco mais até que tudo isso esteja feito.
‫Então, vamos verificar novamente.
‫Vou pressionar o botão e agora você vê que ele congela.
‫E apenas uma vez feito, ele mudou para Dunn.
‫Então, talvez o arquivo de 25 megabytes seja muito pequeno.
‫Vamos fazer o arquivo de 200 megabytes e realmente verificar se existe um no site e se existe um.
‫Tudo bem, vamos tentar novamente.
‫Agora, o arquivo será muito maior e demorará um pouco para ser concluído.
‫Então, estou pressionando o botão.
‫E como você pode ver agora, está congelando, está congelado e não tem nada até que os downloads sejam concluídos.
‫E isso porque estamos no terceiro.
‫Portanto, a tela inteira fica congelada até que o download seja concluído.
‫E isso é algo muito perigoso.
‫Você não deveria fazer isso.
‫Você deve sempre ter cuidado ao fazer coisas que pesam na ameaça principal ou no thread da IU, porque a
‫ameaça principal ou a ameaça da IU está realmente aqui.
‫Ocupado com a atualização da IU, o mesmo acontece com todas as coisas da IU e.
‫Bem, agora meu arquivo no meu programa está praticamente congelado.
‫Vou usar o arquivo de cem megabytes.
‫Talvez seja uma escolha melhor e o que fizemos e ainda veremos a diferença.
‫Direito.
‫Então, acabei de usar aqui um link onde você pode simplesmente baixar arquivos aleatórios.
‫Então, vamos pressioná-lo novamente.
‫Como você pode ver agora, ele está congelado e vai demorar um pouco até que esteja pronto.
‫E aí está você.
‫Está feito.
‫Então baixei o arquivo e está tudo bem.
‫E você também veria que estamos executando a ameaça número um, então essa é a principal ameaça, certo?
‫E estamos executando a ameaça principal e estamos tentando fazer o download de algo e estamos tentando atualizar a
‫interface do usuário e.
‫Bem, é por isso que demora um pouco aqui.
‫Então agora você pode dizer, tudo bem, vamos criar uma tarefa para fazer isso.
‫Então, vamos criar uma tarefa que seja executada e vamos executar algum código aqui.
‫Então, vou apenas copiar o código assim.
‫E agora vamos depurar isso.
‫Então, vamos adicionar um pequeno ponto de depuração aqui.
‫Então, vamos depurar isso apenas para ver quais threads estão realmente envolvidos.
‫Então, vou apertar o botão e que estamos dentro deste tópico.
‫E isso é verdade, temos vários threads de trabalho em que a principal ameaça, que é
‫a ameaça, vimos isso antes, quando executamos algo.
‫Então, se a ameaça principal e então temos nossa tarefa executada, que também tem uma ameaça, e estamos na ameaça
‫cinco.
‫Portanto, você pode ver que a ameaça cinco é uma ameaça ao trabalhador, e é essa que temos aqui.
‫Então, vamos para a próxima etapa.
‫Ainda estamos em execução ou ainda somos uma ameaça, cinco, então vamos fazer de novo, ainda somos uma ameaça cinco.
‫Agora estamos tentando fazer algo.
‫Então, estamos tentando atualizar meu botão.
‫Feito.
‫E vamos para a próxima etapa novamente, como você pode ver, meu aplicativo congela sua expressão de avaliação, meu
‫botão.
‫Então, estamos esperando novamente.
‫Tão pesado para ele e como você pode ver que estamos nessa operação, a exceção para chamar o thread
‫não pode acessar o objeto porque um thread diferente o possui.
‫O que isso significa?
‫Bem, isso significa que meu botão pertence a um tópico diferente.
‫E por qual fio?
‫Bem, ele é de propriedade do UI thread, que é nosso principal thread.
‫Portanto, o thread principal é responsável por cuidar de todos os elementos da IU para que eles não congelem.
‫É importante que você esteja sempre respondendo e, neste caso, não esteja mais respondendo porque
‫estamos tentando acessar esta linha de código, embora ela não esteja no segmento certo.
‫Então, estamos no encadeamento cinco e estamos tentando acessar algo que pertence ao encadeamento um e isso é algo
‫que é inválido.
‫Portanto, temos essa exceção de operação inválida aqui e precisamos encontrar uma solução diferente para gerenciar isso.
‫E geralmente é um conceito de ameaças diferentes.
‫Portanto, geralmente, você deve ter cuidado ao trabalhar com diferentes threads e com diferentes objetos.
‫Se os objetos pertencerem a outros threads, você não poderá alterá-los ou modificá-los.
‫Então, isso é algo do qual você deve estar ciente.
‫Então, como podemos fazer isso?
‫Bem, geralmente, vamos parar o up primeiro e vamos para o botão, portanto, e criar um botão aqui.
‫E eu quero verificar algum botão pressionando ou segurando o controle e pressionando o botão.
‫Portanto, Button herda da base do botão, que é um controle constante, que herda do controle, do elemento
‫da estrutura, do elemento da IU.
‫Que é um objeto visual, que é um objeto de dependência, objeto despachante que somos, então é um objeto
‫despachante e aqui ele apenas verifica o acesso e o acesso muito agressivo.
‫Portanto, este é um objeto de despachante e estamos usando um despachante aqui e o despachante tem muitas variáveis, eventos e
‫assim por diante.
‫Por que eu te mostro isso?
‫Bem, é porque usaremos o dispatcher para gerenciar nosso thread para eles.
‫Meu botão.
‫Então, como o que devo fazer aqui?
‫Bem, eu preciso do meu dispatcher de ponto de botão para que as janelas sejam ameaçadoras.
‫Expedidor As janelas do sistema param de ameaçar aquele objeto expedidor associado.
‫Portanto, agora descobrimos qual thread pertence ao nosso botão ou, na verdade, a qual Fred.
‫Nosso botão pertence.
‫Portanto, vamos verificar o despachante e aqui eu invoco executa a ação especificada de forma assíncrona no encadeamento, o
‫encadeamento da janela do sistema ao qual este despachante está associado.
‫Então é exatamente disso que eu estava falando, o que precisamos fazer.
‫Então, vamos fazer isso e vamos executar o código aqui agora.
‫Então, vou fechar aqui embaixo.
‫E agora você pode ver agora pode ir em frente e dizer, OK, o conteúdo do meu botão apenas diz
‫concluído e vou usar a depuração mais uma vez para ver em qual ameaça estou neste momento.
‫Então, vamos executar o código novamente.
‫Agora, vamos apertar o botão.
‫E como você pode ver, estamos aqui agora.
‫E eu precisaria avaliar muito novamente para que possamos estar no segmento cinco agora.
‫É aqui que fazemos a depuração.
‫Em seguida, vamos para o próximo tópico ou próxima linha.
‫Próxima linha.
‫E então a IU está de volta aos trilhos.
‫Onde aqui.
‫E agora podemos ir para a próxima etapa.
‫Então, estamos no despachante e ele realmente pula o que eu queria mostrar a você.
‫Então, vamos dar uma olhada, vá para o Windows e vamos ver o console de depuração, que é a saída para que possamos
‫dizer a ameaça número cinco.
‫E então dizia a ameaça número um.
‫Portanto, esta é a ameaça número um e essa é a ameaça número cinco.
‫Portanto, o dono do botão, como você pode ver, é a ameaça número um.
‫E para deixar isso um pouco mais claro, podemos adicionar isso à nossa linha aqui.
‫Ameaça número um ou ameaça número fulano de tal é dono do meu botão.
‫Então, agora seremos um pouco mais claros.
‫Vamos executá-lo novamente e ele deve aparecer corretamente.
‫Então aqui está a saída e não há nada de interessante ainda.
‫Pressionamos o botão e você vê que a ameaça número cinco foi executada e então começa o download.
‫E um, não é uma vez feito, diz aqui ameaça.
‫Ninguém é dono do meu botão.
‫Então, vamos pressionar novamente.
‫E agora, como você pode ver, o botão ainda funciona e ainda está atualizando.
‫Então isso é bom.
‫E essa é uma maneira de fazer isso.
‫Há outra maneira, porém, e vou mostrar outra, que é a solução preferida.
‫Vou copiar isso.
‫Meu clique no botão.
‫Vou chamá-lo de meu clique de botão para não interferir.
‫E agora vou dizer em que ameaça estou do lado de fora.
‫Então aqui, qual ameaça eu sou quando clico no botão?
‫Bem, eu deveria estar em vermelho então.
‫Vou usar uma tarefa de peso.
‫A execução dessa tarefa deve ser assíncrona.
‫Portanto, precisamos adicionar a palavra-chave assíncrona aqui.
‫Um estúdio visual ainda não está muito feliz.
‫Portanto, preciso tornar esse método assíncrono.
‫Então, aqui está o meu clique de botão, agora será um método de botão assíncrono que aguardará uma tarefa específica para ser
‫executado de forma assíncrona.
‫E o que eu faço aqui é simplesmente baixar esse arquivo novamente.
‫E, em vez de usar um despachante, o que posso fazer agora é atualizar meu botão fora desta
‫tarefa.
‫Então eu vou fazer isso aqui fora.
‫Vou dizer o conteúdo do meu botão e algo que fiz download.
‫É isso.
‫Então, agora, em vez de fazer isso com um despachante, o que era um pequeno problema, eu o tornei assíncrono.
‫Portanto, agora deve funcionar bem também.
‫Agora, para testar isso, vou alterar o método aqui para clicar no método para clicar no botão para.
‫Caso contrário, este método nunca seria executado.
‫Então vamos fazer isso.
‫E talvez isso também acrescente o tópico que estamos.
‫Portanto, não tente resolver antes de uma tarefa em espera.
‫E então este é depois de uma tarefa de peso e aquele outro vai estar durante uma tarefa de peso.
‫Então, agora vamos executá-lo novamente.
‫Vamos apertar nosso botão.
‫E aqui você vê antes do TASC.
‫Não havia ninguém então durante uma tarefa de peso que era o segmento número dois e depois da tarefa de peso, está no
‫número um novamente e terminamos o download.
‫Essa é uma abordagem diferente que também funciona perfeitamente bem.
‫E essa é uma maneira ainda melhor.
‫Então você não tem que ir pelo caminho de checar, o que ameaçou o meu próprio.
‫Mas você cria um tópico diferente onde você faz as coisas.
‫Mas e você também torna isso um peso.
‫Então você o torna assíncrono.
‫Agora, uma coisinha que também quero mostrar a vocês é um navegador da Web, então o que farei
‫aqui é reduzir o tamanho do botão.
‫Vou colocá-lo aqui no canto superior esquerdo e vou usar um navegador da web.
‫Vou apenas arrastá-lo para lá e torná-lo um pouco maior.
‫Portanto, agora teremos apenas este navegador da Web e ele deve nos mostrar o lado em que estamos.
‫Então o que vai acontecer é que sempre que eu pressionar o botão, vou baixar um site específico,
‫que vou definir manualmente.
‫Portanto, este é apenas um pequeno exemplo para acrescentar ao que vimos até agora.
‫Não vou entrar em um navegador da Web completo.
‫Não vou mostrar como fazer isso.
‫Você pode ir em frente e tentar você mesmo.
‫Vou apenas mostrar como agora você pode usar o HTML
‫que baixou deste link específico, que é codificado e simples de usar ou exibi-lo em um navegador da web.
‫Portanto, https Google ponto com.
‫Então o que vai acontecer é que sempre que eu pressionar o botão, o Google dot com será baixado.
‫Agora, para fazer isso, preciso ter um método específico e não vou digitá-lo manualmente.
‫Vou apenas copiar e colar aqui.
‫Portanto, este método de alteração de HTML será chamado sempre que uma propriedade de dependência for alterada.
‫Então, o que vou dizer aqui é que a mudança de HTML precisa de um objeto de dependência e um argumento de evento de
‫mudança de propriedade de dependência, que é chamado de E aqui.
‫Estou apenas criando um navegador da Web que pegará esse objeto de dependência e o usará como um navegador da Web.
‫E então, se o navegador da Web não for nulo, navegue até uma string específica, que terá um novo valor
‫como string.
‫Portanto, sejam quais forem esses argumentos de dependência, a propriedade mudou, os argumentos de evento são.
‫É daí que eu pego o barbante.
‫Então, isso é basicamente o que precisa ser exibido no navegador da web.
‫Então, eu teria feito isso fácil de uma maneira mais fácil.
‫Mas o problema é que não é tão fácil fazer isso.
‫Portanto, não existem maneiras mais fáceis ou muitas maneiras mais fáceis de fazer isso.
‫Portanto, essa é geralmente a abordagem que você precisa fazer aqui.
‫Portanto, em vez de apenas atualizar o botão com o download de Dan, quero atualizar o navegador da Web e, portanto, o navegador da Web
‫precisa de um nome.
‫Então, vou dar um nome ao navegador da Web e vou chamá-lo de meu navegador da Web.
‫Agora, o navegador da Web, vou chamá-lo aqui ou realmente modificá-lo aqui.
‫O que eu quero fazer é definir o valor desse navegador e quero defini-lo com algo.
‫E você pode ver que precisamos da propriedade de dependência e de um objeto de valor.
‫Então, como faço para conseguir isso?
‫De onde eu consigo isso?
‫Bem, existem várias, várias coisas aqui.
‫Então, um deles é que precisamos de uma propriedade de dependência, então vamos criar uma.
‫Vamos colocá-lo aqui no topo.
‫E, novamente, vou apenas copiar e colar.
‫Vou mostrar como é e o que faz.
‫Portanto, é uma propriedade de dependência somente leitura chamada propriedade HTML.
‫E nós registramos.
‫Ele será registrado com HTML.
‫Como você pode ver, ele precisa de um nome, string, nome, HTML e, em seguida, um tipo de propriedade, um tipo de proprietário e metadados
‫de propriedade.
‫Então, isso é algo que tocamos ao trabalhar com propriedades de dependência no capítulo UPF.
‫Então aqui acabei de criar com HTML.
‫O tipo é uma string.
‫Qual é o dono.
‫É a janela principal.
‫Então, nossa classe aqui.
‫E que tipo de dados são esses ou quais metadados eu quero fornecer a eles e eu forneço os metadados
‫alterados em html.
‫Então, o que isso significa.
‫Bem, sempre que definirmos a propriedade em HTML, a mudança será chamada e é esse método aqui que será
‫chamado.
‫Agora o que podemos fazer é definir o valor do meu navegador com o seguinte.
‫Podemos prosseguir e dizer propriedade HTML e configurá-la com HTML para usar HTML.
‫Precisamos fazer uma pequena solução alternativa aqui ou ter uma pequena solução alternativa.
‫Na verdade, vou chamá-lo de meu HTML assim e preciso criar uma variável aqui, que
‫será uma string meu T e L que só vai dizer blá, apenas uma string que está com um texto estúpido em aqui.
‫Nada especial.
‫Mas, depois de terminar o download, obtemos o resultado em nossa string HTML.
‫Eu não poderia simplesmente dizer HTML aqui porque esta string é criada localmente e não posso
‫criá-la ou está dentro do escopo de nossa tarefa aqui e não posso criá-la fora.
‫É por isso que preciso ter essa pequena solução alternativa para poder prosseguir e dizer que meu HTML é HTML.
‫Então, é isso.
‫A variável aqui, que está no escopo de nosso navegador da Web, dissemos aqui, é por isso que posso ir em
‫frente e configurá-la aqui.
‫Portanto, dentro do escopo de nossa tarefa de esperar.
‫Agora, é claro, precisamos terminar esta linha.
‫Portanto, é assim que você pode definir o valor de um navegador da web.
‫Tudo bem, é um pequeno problema, mas funciona, então vamos testá-lo, vamos executar nosso código.
‫Vamos apertar o botão.
‫E nós temos muitos erros de script, mas isso é porque não dissemos mais nada.
‫Mas como você pode ver aqui estamos no Google agora, então podemos ir para as imagens, para o Google Maps e assim por diante.
‫Então, agora criamos nosso pequeno navegador, que simplesmente nos traz ao Google.
‫Tudo bem, legal.
‫Então, como eu disse, não vou me aprofundar muito em navegadores e outras coisas, e nem mesmo quero me
‫aprofundar muito nesses tópicos.
‫Mas é assim que você deve configurar.
‫Isso é um pouco, uh, sim.
‫Uma pequena configuração que você precisa fazer.
‫Portanto, você precisa ter esse método.
‫Você precisa ter essa propriedade de dependência, e então você pode ir em frente e definir
‫o valor do seu navegador com a propriedade HTML, que é nossa propriedade de dependência e algum código HTML, que é o código
‫original que baixamos do Google dot com.
‫Ou, para resumir mais uma vez, qual é a ideia de usar tópicos diferentes?
‫Bem, você tem a principal ameaça que lida com a interface do usuário e se você quiser
‫fazer algo pesado e demorado, por exemplo, baixar da web, por exemplo, copiar algo de um arquivo para outro ou
‫trabalhar com discos rígidos ou o que quer que seja, é o que realmente faz sentido fazer isso
‫em segundo plano.
‫Então você cria uma tarefa diferente ou um thread diferente que cuida disso.
‫Portanto, aqui criamos uma tarefa assíncrona que faz isso em segundo plano.
‫E uma vez feito isso, podemos prosseguir com o resto.
‫Portanto, não vai congelar nosso tópico principal.
‫Nossa IU ainda funcionará corretamente, e é disso que se trata.
‫Tudo bem.
‫Então, vejo você no.