Visual Studio während des Debuggens: Für die Funktionsbewertung müssen alle Threads ausgeführt werden

86

Beim Debuggen wird plötzlich ein seltsamer Fehler angezeigt. Bisher wurde die Variable in den Überwachungsfenstern korrekt angezeigt. Jetzt erhalte ich immer die Fehlermeldung in den Überwachungsfenstern:

Für die Funktionsbewertung müssen alle Threads ausgeführt werden

Ich kann keine Variable mehr überprüfen. Ich arbeite nicht explizit mit Threads. Was kann ich tun, damit es wieder funktioniert?

Ich habe bereits wie in einigen Foren erwähnt die Funktion "Eigenschaftsauswertung und andere implizite Funktionsaufrufe aktivieren" im Optionsfenster des Debuggers deaktiviert. Aber ohne Erfolg bekomme ich dann den Fehler:

Fehler Implizite Funktionsbewertung vom Benutzer deaktiviert

Maik
quelle
So erhalten Sie den Punkt der Liste: Haben Sie Visual Studio neu gestartet?
MUG4N
Ja, habe ich. Neustart und gleiches Problem.
Maik
Überprüfen Sie dies heraus: stackoverflow.com/questions/4280604/…
MUG4N
Selbst wenn es funktionieren würde, kann dies nicht die Lösung sein, da ich das NET 4.x Framework verwenden möchte. Ich möchte kein Downgrade durchführen, nur weil bei diesem Problem. Ich frage mich, warum es vor einiger Zeit funktioniert hat.
Maik
Ich habe das gleiche Problem. VS2013 hatte eine Schaltfläche, auf die Sie klicken konnten, aber VS2015 verfügt nicht über diese Schaltfläche.
Spongman

Antworten:

107

Aus dem msdn Forum:

Dies ist an und für sich kein Fehler, sondern eher eine Funktion Ihres Debuggers. Bei einigen Eigenschaften muss Code ausgeführt werden, damit die Eigenschaft gelesen werden kann. Wenn dies jedoch eine threadübergreifende Interaktion erfordert, müssen möglicherweise auch andere Threads ausgeführt werden. Der Debugger tut dies nicht automatisch, kann es aber mit Ihrer Erlaubnis. Klicken Sie einfach auf das kleine Bewertungssymbol, um Ihren Code auszuführen und die Eigenschaft zu bewerten.

Geben Sie hier die Bildbeschreibung ein

Weitere Details zu diesem Verhalten finden Sie in diesem hervorragenden Artikel

MUG4N
quelle
9
Ich habe diesen Artikel gelesen. Ich habe keine solche Schaltfläche zum Klicken, also nicht genau das Problem, das ich habe. Seltsamerweise hat es funktioniert, seit ich heute ein Upgrade auf Visual Studio 2015 RC durchgeführt habe.
Maik
1
Gleiches Problem hier: stackoverflow.com/questions/4460206/…
MUG4N
4
Wenn Sie kein Symbol sehen, ändern Sie die Variable / den Befehl, um die Abfrage über das Überwachungsfenster auszuführen, anstatt die Eigenschaften mithilfe der Dropdown-Liste zu untersuchen. Zum Beispiel Hinzufügen .ToList()oder .Any().
Hp93
4
Ich bin mir nicht sicher warum, aber das Aufrufen von .ToList () bei meiner Abfrage hat das Problem behoben
J.Kirk.
1
@ J.Kirk. Ich habe das Gleiche gefunden - danke! Ich hatte varund IEnumerable<T>und nur zugewiesen db.AGENCY_TABLE.OrderBy(e => e.Name);- aber sobald ich varmit .ToList()(oder List<T>mit .ToList()auch funktioniert) verwendet, zeigt es das Ergebnis!
Vapcguy
22

Ich bin auf dieses Problem gestoßen, als ich nur versucht habe, mit Entity Framework Elemente aus einer Tabelle namens "AGENCY" abzurufen:

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

Geben Sie hier die Bildbeschreibung ein

Wenn Sie im Debug-Modus über Agenturen fahren, auf klicken, um die Optionen zu erweitern, und auf Ergebnisse klicken, wird das gefürchtete Symbol "Die Funktionsbewertung erfordert, dass alle Threads ausgeführt werden" mit dem Symbol "Nicht eingeben" am Ende angezeigt, auf das das Klicken nichts bewirkt hat.

2 mögliche Lösungen:

  1. .ToList()Am Ende hinzufügen :

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

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

    Dank geht an Hp93, der mir geholfen hat, zu dieser Lösung zu gelangen. In den Kommentaren zu MUG4Ns Antwort, in der ich diese Lösung gefunden habe, wird auch erwähnt, dass versucht .Any()wird .ToList(), aber dies gibt einen Booleschen Wert anstelle eines <T>, wie es <AGENCY>ist, also würde es wahrscheinlich nicht helfen.

  2. Problemumgehung - Versuchen Sie einen anderen Pfad in den Debug-Optionen. Ich habe festgestellt, dass ich auf "Nicht öffentliche Mitglieder"> "_internalQuery"> ObjectQuery> Ergebnisansicht klicken und meine Werte auf diese Weise abrufen kann.

Geben Sie hier die Bildbeschreibung ein

vapcguy
quelle
8

MUG4N hat in der Tat eine korrekte Antwort geliefert. Wenn Sie jedoch beim Debuggen über die Codezeile fahren, sehen Sie sich möglicherweise Folgendes an. Wenn ja, klicken Sie auf das kleine Symbol zur Neubewertung, das im Bild unten hervorgehoben ist ...

Geben Sie hier die Bildbeschreibung ein

NB : Ich habe dieses Bild durch Anheften erhalten. Normalerweise befindet sich das Symbol für die Neubewertung in der Mitte des Fensters und nicht in der linken Spalte.

Ewan
quelle
2

Sie sollten threadsicher aufrufen, da der Zugriff auf Windows-Formularsteuerelemente beim Multithreading nicht threadsicher ist. Dies ist mein einfacher Code, der Thread sicher aufruft und den Fortschrittsbalken setzt.

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

Weitere Informationen MSDN

TAHA SULTAN TEMURI
quelle
1

Ich benutze die nächste Problemumgehung, um zu bestehen:

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

Jetzt habe ich einen Wert für OtherThreadField.

sh2dow
quelle