AJUDA COM ERRO BACKGROUND WORK
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.
O Erro ocorre quando eu mando exibir a form que esta com o browser imprimir.showDialog.
Coloca isso no Load do form.
CheckForIllegalCrossThreadCalls = False
CheckForIllegalCrossThreadCalls = False
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.
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.
O WebBrowser é um controle ActiveX e como tal, não é apropriado para uso com threads.
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?
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.
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
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.
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.
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ê...
Tópico encerrado , respostas não são mais permitidas