AJUDA COM ERRO BACKGROUND WORK

KURTGU 04/04/2017 10:47:34
#472983
Pessoal estou usando o background work para deixar aplicação sem travar e mas fácil de trabalhar, estou tentando abrir uma form com um Webbrowser que carregar um relatório mas a form nem sequer abre se tiver o web browser, descobri que o erro se dar pois o o webbroser esta sendo criando fora da sua Thread, segue imagem. do erro já tentei fazer alguma coisa pra solucionar este erro mais não estou conseguindo.


KURTGU 04/04/2017 13:23:01
#472994
O Erro ocorre quando eu mando exibir a form que esta com o browser imprimir.showDialog.
NILSONTRES 04/04/2017 13:53:34
#472999
Coloca isso no Load do form.
CheckForIllegalCrossThreadCalls = False
KURTGU 04/04/2017 14:04:01
#473001
Citação:

:
Coloca isso no Load do form.
CheckForIllegalCrossThreadCalls = False



Já tinha colocado...Já tentei de tudo pra entender o erro e aonde ele acontece... Mais assim que eu mando ele Da o form.showdialog a forma que esta com o webbrowser ele da o erro, o mais engraçado que só da o erro quando a form esta com o webbwroser adicionado nela.
KURTGU 04/04/2017 14:10:09
#473002
Em outro projeto funciona normalmente pensei que tinha zuado algo no visual mais fiz os testes é somente neste projeto e nesta form. Já excluir a form e refiz ela mais da a mesma coisa, ao adicionar o webbrowser ele da o erro e se tentar fazer dim web as new webbrowser da a mesma coisa.
KERPLUNK 04/04/2017 16:42:27
#473007
O WebBrowser é um controle ActiveX e como tal, não é apropriado para uso com threads.
KURTGU 04/04/2017 17:17:27
#473015
Citação:

:
O WebBrowser é um controle ActiveX e como tal, não é apropriado para uso com threads.



Kerpluck nesta form eu não estou usando seria no projeto todo?
KERPLUNK 04/04/2017 17:20:51
#473017
Pode influenciar sim. Componente ActiveX é sempre instanciado ao iniciar a aplicação. Ou seja, se ele está referenciado, sempre que rodar a aplicação ele será instanciado. Você realmente precisa usar um BackgroundWorker? Se você quer que suas rotinas sejam assíncronas, você deve usar métodos assíncronos nas suas classes(que por sua vez, também serão assíncronas). BackgroundWorker é para outras finalidades que não utilizem componentes com alguma interface gráfica e algumas outras limitações.
OCELOT 04/04/2017 17:37:09
#473021
Resposta escolhida
Citação:

CheckForIllegalCrossThreadCalls = False


Não, simplesmente NÃO, isso não resolve nada, no máximo esconde o [Ô]erro[Ô] que nada mais é que um aviso que você está fazendo o que não devia pois mais tarde vai ter problemas. Até hoje não vi uma pessoa que falou para mudar essa propriedade que soubesse o que ela faz, no máximo sabe que faz parar de dar um erro mas não sabe o motivo, o qual nem é o caso aqui.

Você está entrando no mundo do multithreading, e como a maioria das pessoas está fazendo isso da forma errada.

O que ninguém parece entender é que threads não se usa para manipular telas, telas só podem ser modificadas na thread principal, que é a que criou as telas, e isso é assim para praticamente qualquer linguagem ou sistema operacional, desconheço qualquer um que seja thread-safe e permita modificar as telas em qualquer thread.

Pode até parecer que funciona, que você já faz coisas desta forma e sempre funcionou, mas não deixa de ser errado, e como você mesmo está vendo tudo parece da mesma forma que o outro projeto mas neste não funciona, isso tudo porque o uso do Windows Forms em várias threads tem o comportamento indefinido, pois ele não foi feito para isso.

No geral você precisa saber muito bem o que está fazendo quando começa a trabalhar com threads, o background worker facilita isso mas ainda assim o próprio nome dele já diz tudo, é [Ô]background[Ô] ou [Ô]segundo plano[Ô], e qualquer coisa que tenha a ver com telas não é segundo plano, no geral ele deve ser usado da seguinte forma

  • Thread do Form separa os dados necessários para iniciar o processamento
  • Thread do Form inicia o BackgroundWorker
  • BackgroundWorker processa os dados no evento DoWork
  • Opcionalmente o BackgroundWorker pode chamar o ReportProgress para informar a Thread do Form sobre o trabalho pelo uso do evento ProgressChanged, isso deve ser feito o mínimo possível pois é lento
  • BackgroundWorker termina de processar e sai da função
  • BackgroundWorker vai disparar o evento RunWorkerCompleted e ele vai ser executado na Thread do Form, é aqui que você pega o resultado do que foi processado e exibe na tela

    Então se você está gerando um relatório em HTML e mostrando em um WebBrowser você deve separar o mínimo de dados possíveis para o BackgroundWorker conseguir processar e montar o HTML, se nele você acessa o banco de dados então seria por exemplo as informações necessárias para filtrar os dados, tendo isso em mãos você executa o RunWorkerAsync() e processa os dados no evento DoWork, montado o HTML como precisar ali, terminando de montar o HTML você pode por exemplo atribuir ele ao e.Result e assim esse valor vai ser passado para o RunWorkerCompleted também no e.Result, onde você pega esse HTML e exibe o novo form com o WebBrowser.
  • KURTGU 04/04/2017 23:36:05
    #473037
    Ocelot não sei se esta correto usar o background work pra isto, exemplo tenho o meu webservice aonde faco todas as funções de um crud funciona perfeitamente da forma que precisava, comecei a usar o backgroundwork para exibir o que estava acontecendo e não deixando o sistema travado na hora da busca exemplo. quando estou listando os pacientes que estão aguardando agendamento faco todo o procedimento pelo background work. só não consigo entender o por que deste erro somente nesta tela, que nem background work tem kkkk, nesta tela simplesmente pego uma html que fiz e salvei na pasta do projeto e preencho exemplo com os dados que vem do form funcionava perfeitamente após eu adicionar esses background work que fica em outras telas esta apresentando isso.
    KERPLUNK 05/04/2017 00:25:16
    #473040
    Deixa ver se eu entendi: Você está usando o WebBrowser ou um client HTTP qualquer para baixar um HTML que é na verdade um WebService. Se for isso, amigo, tenho péssimas notícias pra você...
    Página 1 de 2 [16 registro(s)]
    Tópico encerrado , respostas não são mais permitidas