Eu tenho um cenário. (Windows Forms, C #, .NET)
- Existe um formulário principal que hospeda algum controle do usuário.
- O controle do usuário realiza algumas operações pesadas de dados, de modo que, se eu chamar diretamente o
UserControl_Load
método, a interface do usuário não responde pela duração da execução do método de carregamento. - Para superar isso, carrego dados em segmentos diferentes (tentando alterar o código existente o mínimo possível)
- Usei um thread de trabalho em segundo plano que carregará os dados e, quando concluído, notificará o aplicativo de que ele fez seu trabalho.
- Agora veio um problema real. Toda a interface do usuário (formulário principal e seus controles de usuário filho) foi criada no encadeamento principal principal. No método LOAD do usercontrol, estou buscando dados com base nos valores de algum controle (como caixa de texto) no userControl.
O pseudocódigo ficaria assim:
CÓDIGO 1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
A exceção que deu foi
Operação de encadeamento cruzado inválida: controle acessado a partir de um encadeamento diferente do encadeamento em que foi criado.
Para saber mais sobre isso, pesquisei no Google e surgiu uma sugestão como usar o código a seguir
CÓDIGO 2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
MAS MAS MAS ... parece que estou de volta à estaca zero. O Aplicativo novamente não responde. Parece ser devido à execução da linha # 1 se condição. A tarefa de carregamento é novamente executada pelo encadeamento pai e não o terceiro que eu criei.
Não sei se percebi isso certo ou errado. Eu sou novo no segmento.
Como resolvo isso e também qual é o efeito da execução da Linha # 1 se bloco?
A situação é a seguinte : desejo carregar dados em uma variável global com base no valor de um controle. Não quero alterar o valor de um controle do thread filho. Eu nunca vou fazer isso a partir de um thread filho.
Portanto, basta acessar o valor para que os dados correspondentes possam ser buscados no banco de dados.