visual una studio scripts poner modo interrupcion hacer habilitada está encuentra depurar depuración depuracion debuggear debug como chrome breakpoint aplicacion c# visual-studio-debugging

c# - una - la aplicacion se encuentra en modo de interrupcion visual studio 2017



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

De repente recibo un extraño error al depurar. Hasta ahora, la variable en las ventanas del reloj se ha mostrado correctamente. Ahora recibo siempre el mensaje de error en las ventanas del reloj:

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

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

Ya desactivé como se menciona 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, obtengo el error:

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


De hecho, MUG4N ha proporcionado una respuesta correcta; sin embargo, si pasa el cursor sobre la línea de código en la depuración, puede estar 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 ...

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.


Debe hacer una llamada segura para subprocesos porque acceder a los controles de formulario de Windows no es seguro para subprocesos en subprocesos múltiples. Este es mi código simple que hace que Thread sea seguro 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


Desde el foro 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 poder leer la propiedad, pero si esto requiere interacción entre subprocesos, entonces otros subprocesos pueden tener que ejecutarse también. El depurador no hace esto automáticamente, pero ciertamente puede, con su permiso. Simplemente haga clic en el pequeño icono de evaluación y ejecutará su código y evaluará la propiedad.

Para más detalles sobre este comportamiento, consulte este excelente article


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

Al 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 "No ingresar" al final del cual, al hacer clic, no 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 va a Hp93 por ayudarme a llegar a esta solución. En los comentarios sobre la respuesta de MUG4N donde encontré esta solución, también menciona intentar .Any() lugar de .ToList() , pero esto le da un Boolean en lugar de un <T> , como <AGENCY> , por lo que probablemente no lo haría '' t ayuda.

  2. Solución alternativa: pruebe 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.


Yo uso la siguiente solución para pasar:

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

Ahora tengo un valor para OtherThreadField.