Estou recebendo de repente um erro estranho durante a depuração. Até agora, a variável nas janelas de observação foi mostrada corretamente. Agora estou sempre recebendo a mensagem de erro nas janelas de observação:
A avaliação da função requer que todos os threads sejam executados
Não consigo mais verificar nenhuma variável. Não sou explícito ao trabalhar com tópicos. O que posso fazer para que volte a funcionar?
Já desativei como mencionei em alguns fóruns a função: "Habilitar avaliação de propriedades e outras chamadas de função implícitas" na janela de opções do depurador. Mas, sem sucesso, estou recebendo o erro:
Avaliação de função implícita de erro desativada pelo usuário
Respostas:
Do fórum msdn :
Para mais detalhes sobre este comportamento, consulte este excelente artigo
fonte
.ToList()
ou.Any()
.var
eIEnumerable<T>
e apenas atribuindodb.AGENCY_TABLE.OrderBy(e => e.Name);
- mas uma vez que useivar
com.ToList()
(ouList<T>
com.ToList()
também funciona), revela o resultado!Encontrei esse problema ao tentar obter itens de uma tabela chamada "AGÊNCIA" usando o Entity Framework:
var agencies = db.AGENCY.OrderBy(e => e.FULLNAME);
Passar o mouse sobre as agências no modo de depuração, clicar para expandir as opções e clicar em Resultados daria o temido "A avaliação da função requer que todos os threads sejam executados" com um ícone "Não entrar" no final, no qual clicar não fez nada.
2 soluções possíveis:
Adicione
.ToList()
no final:var agencies = db.AGENCY_TABLE.OrderBy(e => e.FULLNAME).ToList();
List<AGENCY_TABLE> agencies = db.AGENCY_TABLE.OrderBy(e => e.FULLNAME).ToList();
O crédito vai para o HP93 por me ajudar a encontrar essa solução. Nos comentários sobre a resposta do MUG4N onde encontrei essa solução, também menciona tentar ao
.Any()
invés de.ToList()
, mas isso dá um booleano ao invés de um<T>
, como<AGENCY>
está, então provavelmente não ajudaria.Solução alternativa - tente um caminho diferente nas opções de depuração. Descobri que poderia clicar em "Membros não públicos"> "_internalQuery"> ObjectQuery> Exibir resultados e obter meus valores dessa forma.
fonte
O MUG4N realmente forneceu uma resposta correta, no entanto, se você passar o mouse sobre a linha de código na depuração, poderá estar vendo algo como o abaixo. Se sim, clique no pequeno ícone de reavaliar destacado na imagem abaixo ...
NB : Obtive esta imagem fixando, normalmente os ícones de reavaliação estão no meio da janela e não na coluna da esquerda.
fonte
Você deve fazer uma chamada segura para thread porque o acesso aos controles de formulário do Windows não é seguro para threads em multithreading. Este é o meu código simples que torna a chamada segura do Thread e define a barra de progresso.
public partial class Form1 : Form {// This delegate enables asynchronous calls for setting // the text property on a TextBox control. delegate void StringArgReturningVoidDelegate(string text); private Thread demoThread = null; public int Progresscount = 0; static EventWaitHandle waithandler = new AutoResetEvent(false); public Form1() { InitializeComponent(); } public static bool CheckForInternetConnection() { try { using (var client = new WebClient()) { using (var stream = client.OpenRead("http://www.google.com")) { return true; } } } catch { return false; } } public void Progressincrement() { waithandler.WaitOne(); while (CheckForInternetConnection()==true) { if (Progresscount==100) { break; } SetLabel("Connected"); Progresscount += 1; SetProgress(Progresscount.ToString()); Thread.Sleep(TimeSpan.FromSeconds(1)); } if (Progresscount <100) { Startthread(); } SetLabel("Completed"); } public void Startthread () { this.demoThread= new Thread(new ThreadStart(Progressincrement)); this.demoThread.Start(); SetLabel("Waiting for connection"); while (CheckForInternetConnection() == false) ; waithandler.Set(); } private void SetLabel(string text) { // InvokeRequired required compares the thread ID of the // calling thread to the thread ID of the creating thread. // If these threads are different, it returns true. if (this.label1.InvokeRequired) { StringArgReturningVoidDelegate d = new StringArgReturningVoidDelegate(SetLabel); this.Invoke(d, new object[] { text }); } else { this.label1.Text = text; } } private void SetProgress(string Value) { // InvokeRequired required compares the thread ID of the // calling thread to the thread ID of the creating thread. // If these threads are different, it returns true. if (this.progressBar1.InvokeRequired) { StringArgReturningVoidDelegate d = new StringArgReturningVoidDelegate(SetProgress); this.Invoke(d, new object[] {Value}); } else { this.progressBar1.Value = Convert.ToInt32(Value); } } private void Form1_Load(object sender, EventArgs e) { Startthread(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Responsive"); } }
Para mais informações MSDN
fonte
Eu uso a próxima solução alternativa para passar:
var OtherThreadField = ""; Invoke(new MethodInvoker(delegate { OtherThreadField = ExecuteNeededMEthod(); }));
Agora eu tenho um valor para OtherThreadField.
fonte
Isso não é um erro, mas mais um recurso do seu depurador.
O depurador não faz isso automaticamente, mas certamente pode, com a permissão do usuário. Basta clicar no pequeno ícone de espaço e ele executará o código e avaliará a propriedade.
fonte