/ / Invocar chamadas envolvendo controles WPF hospedados com formulários WinForm nunca retornam - c #, .net, wpf, multithreading, winforms

Invocar chamadas envolvendo controles WPF hospedado com formulários WinForm nunca retornar - c #, .net, wpf, multithreading, winforms

Eu tenho um programa Windows Forms que hospeda váriosControles WPF. É uma ferramenta de execução de teste. Encontramos um problema em que as chamadas de Invocação nunca retornam. Isso está acontecendo para um dos planos de testes escritos por um de nossos usuários.

O problema ocorre em diferentes chamadas ao longo do programa. Dois exemplos:

winForm.Invoke(new Action(() => wpfControl.DataContext = something));
Application.Current.Dispatcher.Invoke(new Action(() => result.Container.Clear()));

O encadeamento chamado Invoke nunca retorna da Invoke. Eu esperava que houvesse um conflito com o thread da GUI, mas o thread da GUI está executando bem. Curiosamente, todos os controles WinForm estão se comportando normalmente, mas nenhum controle WPF responde ao usuário. Nenhum dos outros segmentos de trabalho parece estar bloqueado.

Duas perguntas vêm à mente:

  1. Alguém tem alguma sugestão de depuração?
  2. Por que todos os controles WPF seriam bloqueados, mas todos os controles WinForm funcionam bem?

Editar: Eu deveria ter mencionado que essa pode ser uma condição de corrida de algum tipo. É visto com pouca frequência e somente após o aplicativo estar funcionando normalmente há algum tempo.

Respostas:

2 para resposta № 1

Não sei exatamente o que está acontecendo, mas vocêtem muito pouca informação aqui para continuar. Você deve obter dotpeek ou refletor e colocar um ponto de interrupção no "loop" interno do WPF e ver POR QUE ele não está atualizando / por que não é chamado.

A técnica mais poderosa na depuração é realmente depurar o código interno. Também seria interessante ver o que acontece se você usar a ferramenta Snoop.

Invoke em si é muito boa receita para cadeados mortos. Eu me deparei com impasses, já vi outros, etc. Se possível, veja se você consegue se safar BeginInvoke.


1 para resposta № 2

Você precisa chamar (dipatch) pelo próprio controle.

use este código wpfControl.InvokeIfRequired(() => wpfControl.DataContext = something); E isto wpfControl.InvokeIfRequired((() => result.Container.Clear())

public static void InvokeIfRequired(this DispatcherControl control, Action operation)
{
if (control.Dispatcher.CheckAccess())
{
operation();
}
else
{
control.Dispatcher.BeginInvoke(DispatcherPriority.Normal, operation);
}
}

0 para resposta № 3

Se eu entendi a pergunta corretamente, você tem um Windows Forms no qual hospeda controles WPF.

Primeiro de tudo, por que você faria algo assim?

Windows Forms tem controles de janela
O WPF possui controles WPF.

Ultimamente, li que é possível do WPF hospedar formulários WF. fonte (Pro WPF 4.5 em C #, 4ª edição)

Se não me engano, os controles WPF são executados em seu próprio segmento. Ao contrário dos controles do WF. Isso pode bloquear os controles do WPF.

Nb. Se as pessoas estão votando pelo menos pelo menos, têm a coragem de discutir o porquê.