Visual Studio durante a depuração: a avaliação da função requer que todos os threads sejam executados

96

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

Maik
fonte
Para entender esse ponto da lista: Você reiniciou o Visual Studio?
MUG4N
Sim eu fiz. Reiniciado e mesmo problema.
Maik
Mesmo que funcionasse, essa não pode ser a solução, pois quero usar o NET 4.x Framework. Eu não quero fazer downgrade apenas porque se esse problema. Estou me perguntando por que estava funcionando há algum tempo.
Maik
Eu tenho o mesmo problema. O VS2013 tinha um botão em que você podia clicar, mas o VS2015 não tem esse botão.
Spongman

Respostas:

119

Do fórum msdn :

Este não é um erro em si, mas mais um recurso do seu depurador. Algumas propriedades requerem que o código seja executado para que a propriedade seja lida, mas se isso requer interação entre threads, então outras threads também podem ser executadas. O depurador não faz isso automaticamente, mas certamente pode, com sua permissão. Basta clicar no pequeno ícone de avaliação e ele executará seu código e avaliará a propriedade.

insira a descrição da imagem aqui

Para mais detalhes sobre este comportamento, consulte este excelente artigo

MUG4N
fonte
9
Eu li este artigo. Não tenho esse botão para clicar, então não é exatamente o problema que tenho. O estranho é que estava funcionando desde que atualizei para o Visual Studio 2015 RC hoje.
Maik
1
O mesmo problema aqui: stackoverflow.com/questions/4460206/…
MUG4N
4
Se você não vir nenhum ícone, tente modificar a variável / comando para executar a consulta na janela de observação, em vez de usar o menu suspenso para explorar suas propriedades. Por exemplo, adicionar .ToList()ou .Any().
HP93 de
4
Não sei por que, mas chamar .ToList () em minha consulta corrigiu o problema
J.Kirk.
1
@ J.Kirk. Eu encontrei a mesma coisa - obrigado! Eu estava usando vare IEnumerable<T>e apenas atribuindo db.AGENCY_TABLE.OrderBy(e => e.Name);- mas uma vez que usei varcom .ToList()(ou List<T>com .ToList()também funciona), revela o resultado!
vapcguy
23

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);

insira a descrição da imagem aqui

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:

  1. 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.

  2. 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.

insira a descrição da imagem aqui

vapcguy
fonte
9

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 ...

insira a descrição da imagem aqui

NB : Obtive esta imagem fixando, normalmente os ícones de reavaliação estão no meio da janela e não na coluna da esquerda.

Ewan
fonte
Isso funcionou para mim. Não acredito que não tentei isso, obrigado pela resposta.
petey m
2

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

TAHA SULTAN TEMURI
fonte
1

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.

sombra
fonte
0

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.

Verifique a captura de tela abaixo para referência

Rohit
fonte