Visual Studio durante la depuración: la evaluación de la función requiere que se ejecuten todos los subprocesos

93

De repente, aparece un error extraño durante la depuración. Hasta ahora, la variable en las ventanas de vigilancia se ha mostrado correctamente. Ahora siempre recibo el mensaje de error en las ventanas del reloj:

La evaluación de la función requiere que se ejecuten todos los subprocesos

Ya no puedo verificar ninguna variable. No soy explícito trabajando con hilos. ¿Qué puedo hacer para que vuelva a funcionar?

Ya deshabilité como se mencionó en algunos foros la función: "Habilitar evaluación de propiedades y otras llamadas a funciones implícitas" en la ventana de opciones del depurador. Pero sin éxito, aparece el error:

Error Evaluación de función implícita deshabilitada por el usuario

Maik
fuente
Para obtener ese punto de la lista: ¿Ha reiniciado Visual Studio?
MUG4N
Sí, lo hice. Reiniciado y mismo problema.
Maik
mira
Incluso si funciona, esta no puede ser la solución, ya que quiero usar NET 4.x Framework. No quiero degradar solo porque si este problema. Me pregunto por qué estaba funcionando hace algún tiempo.
Maik
Tengo el mismo problema. VS2013 tenía un botón en el que podía hacer clic, pero VS2015 no tiene este botón.
Spongman

Respuestas:

113

Desde el foro de msdn :

Esto no es un error en sí mismo, sino más bien una característica de su depurador. Algunas propiedades requieren que se ejecute código para que se lea la propiedad, pero si esto requiere interacción entre subprocesos, es posible que también se deban ejecutar otros subprocesos. El depurador no hace esto automáticamente, pero ciertamente puede hacerlo con su permiso. Simplemente haga clic en el pequeño icono de evaluación y ejecutará su código y evaluará la propiedad.

ingrese la descripción de la imagen aquí

Para más detalles sobre este comportamiento, consulte este excelente artículo.

MUG4N
fuente
9
Leí este artículo. No tengo tal botón para hacer clic, así que no es exactamente el problema que tengo. Lo suficientemente extraño es que estaba funcionando desde que actualicé a Visual Studio 2015 RC hoy.
Maik
1
El mismo problema aquí: stackoverflow.com/questions/4460206/…
MUG4N
4
Si no ve ningún icono, intente modificar la variable / comando para ejecutar la consulta desde la ventana de observación, en lugar de usar el menú desplegable para explorar sus propiedades. Por ejemplo, agregando .ToList()o .Any().
Hp93
4
No estoy seguro de por qué, pero llamar a .ToList () en mi consulta solucionó el problema
J.Kirk.
1
@ J. Kirk. Encontré lo mismo, ¡gracias! Había estado usando vary IEnumerable<T>y simplemente asignando db.AGENCY_TABLE.OrderBy(e => e.Name);, pero una vez que usé varcon .ToList()(o List<T>con .ToList()también funciona), ¡revela el resultado!
vapcguy
23

Me encontré con este problema cuando intentaba obtener elementos de una tabla llamada "AGENCIA" usando Entity Framework:

var agencies = db.AGENCY.OrderBy(e => e.FULLNAME);

ingrese la descripción de la imagen aquí

Pasar el cursor sobre las agencias en modo de depuración, hacer clic para expandir las opciones y hacer clic en Resultados daría el temido "La evaluación de la función requiere que se ejecuten todos los subprocesos" con un ícono de "No ingresar" al final en el que, al hacer clic, no se hizo nada.

2 posibles soluciones:

  1. Agregue .ToList()al final:

    var agencies = db.AGENCY_TABLE.OrderBy(e => e.FULLNAME).ToList();

    List<AGENCY_TABLE> agencies = db.AGENCY_TABLE.OrderBy(e => e.FULLNAME).ToList();

    El crédito es para Hp93 por ayudarme a encontrar esta solución. En los comentarios sobre la respuesta de MUG4N donde encontré esta solución, también menciona intentar en .Any()lugar de .ToList(), pero esto da un booleano en lugar de <T>, como <AGENCY>es, por lo que probablemente no ayudaría.

  2. Solución alternativa: pruebe con una ruta diferente en las opciones de depuración. Descubrí que podía hacer clic en "Miembros no públicos"> "_internalQuery"> ObjectQuery> Vista de resultados y obtener mis valores de esa manera.

ingrese la descripción de la imagen aquí

vapcguy
fuente
9

De hecho, MUG4N ha proporcionado una respuesta correcta; sin embargo, si pasa el mouse sobre la línea de código en depuración, es posible que esté viendo algo como lo siguiente. Si es así, haga clic en el pequeño icono de reevaluación resaltado en la imagen a continuación ...

ingrese la descripción de la imagen aquí

NB : Obtuve esta imagen fijando, normalmente el icono de reevaluación está en el medio de la ventana y no en la columna de la izquierda.

Ewan
fuente
Esto funcionó para mí. No puedo creer que no lo intenté, gracias por la respuesta.
petey m
2

Debe realizar una llamada segura para subprocesos porque el acceso a los controles de formularios de Windows no es seguro para subprocesos en multiproceso. Este es mi código simple que hace que Thread sea una llamada segura y establece la barra de progreso.

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 más información MSDN

TAHA SULTAN TEMURI
fuente
1

Utilizo la siguiente solución para aprobar:

var OtherThreadField = "";
Invoke(new MethodInvoker(delegate
                    {
                        OtherThreadField = ExecuteNeededMEthod();
                    }));

Ahora tengo un valor para OtherThreadField.

sh2dow
fuente