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
Respuestas:
Desde el foro de msdn :
Para más detalles sobre este comportamiento, consulte este excelente artículo.
fuente
.ToList()
o.Any()
.var
yIEnumerable<T>
y simplemente asignandodb.AGENCY_TABLE.OrderBy(e => e.Name);
, pero una vez que usévar
con.ToList()
(oList<T>
con.ToList()
también funciona), ¡revela el resultado!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);
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:
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.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.
fuente
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 ...
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.
fuente
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
fuente
Utilizo la siguiente solución para aprobar:
var OtherThreadField = ""; Invoke(new MethodInvoker(delegate { OtherThreadField = ExecuteNeededMEthod(); }));
Ahora tengo un valor para OtherThreadField.
fuente