Hata Ayıklama sırasında Visual Studio: İşlev değerlendirmesi, tüm iş parçacıklarının çalıştırılmasını gerektirir


93

Hata ayıklama sırasında aniden garip bir hata alıyorum. Şimdiye kadar izleme pencerelerindeki değişken doğru bir şekilde gösteriliyordu. Şimdi izleme pencerelerinde her zaman hata mesajını alıyorum:

İşlev değerlendirmesi, tüm iş parçacıklarının çalışmasını gerektirir

Artık herhangi bir değişkeni kontrol edemiyorum. Açıkça konu başlıkları ile çalışmıyorum. Tekrar çalışmasını sağlamak için ne yapabilirim?

Bazı forumlarda belirtildiği gibi hata ayıklayıcının seçenek penceresinde "Özellik Değerlendirmesini ve diğer örtük işlev Çağrılarını etkinleştir" işlevini devre dışı bıraktım. Ama başarı olmazsa şu hatayı alıyorum:

Hata Örtük İşlev değerlendirmesi kullanıcı tarafından devre dışı bırakıldı


Listenin bu noktasını almak için: Visual Studio'yu yeniden başlattınız mı?
MUG4N

Evet yaptım. Yeniden başlatıldı ve aynı sorun.
Maik


NET 4.x Framework'ü kullanmak istediğim için işe yarasa bile çözüm olamaz. Sırf bu sorun varsa düşürmek istemiyorum. Bir süre önce neden işe yaradığını merak ediyorum.
Maik

bende de aynı sorun var VS2013'te tıklayabileceğiniz bir düğme vardı, ancak VS2015'te bu düğme yok.
Spongman

Yanıtlar:


113

Gönderen msdn forum:

Bu kendi başına bir hata değil, daha çok hata ayıklayıcınızın bir özelliğidir. Bazı özellikler, özelliğin okunabilmesi için kodun çalıştırılmasını gerektirir, ancak bu, iş parçacıkları arası etkileşim gerektiriyorsa, diğer iş parçacıkları da çalışmak zorunda kalabilir. Hata ayıklayıcı bunu otomatik olarak yapmaz, ancak sizin izninizle kesinlikle yapabilir. Küçük değerlendirme simgesine tıklamanız yeterlidir ve kodunuzu çalıştıracak ve mülkü değerlendirecektir.

görüntü açıklamasını buraya girin

Bu davranışla ilgili daha fazla ayrıntı için bu mükemmel makaleye bakın


9
Bu makaleyi okudum. Tıklayacak böyle bir düğmem yok, Yani tam olarak sahip olduğum sorun değil. Garip, bugün Visual Studio 2015 RC'ye yükselttiğimden beri çalışıyor olması.
Maik

1
Burada da aynı sorun var: stackoverflow.com/questions/4460206/…
MUG4N

4
Herhangi bir simge görmüyorsanız, özelliklerini keşfetmek için açılır menüyü kullanmak yerine, sorguyu izleme penceresinden yürütmek için değişkeni / komutu değiştirmeyi deneyin. Örneğin, ekleme .ToList()veya .Any().
Hp93

4
Neden olduğundan emin değilim ama sorgumda .ToList () 'i çağırmak sorunu çözdü
J.Kirk.

1
@ J.Kirk. Ben de aynı şeyi buldum - teşekkürler! Ben kullanarak olmuştu varve IEnumerable<T>sadece atama db.AGENCY_TABLE.OrderBy(e => e.Name);- ama bir kez kullandığım varile .ToList()(veya List<T>birlikte .ToList()de çalışıyor), bu sonuç ortaya çıkarır!
vapcguy

23

Entity Framework kullanarak "AGENCY" adlı bir tablodan öğeler almaya çalışırken bu sorunla karşılaştım:

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

görüntü açıklamasını buraya girin

Hata ayıklama modunda ajansların üzerine gelmek, seçenekleri genişletmek için tıklamak ve Sonuçlar'ı tıklamak, sonunda tıklandığında hiçbir şey yapmayan bir "Girmeyin" simgesiyle korkunç "İşlev değerlendirmesi tüm iş parçacıklarının çalışmasını gerektirir" sonucunu verecektir.

2 olası çözüm:

  1. .ToList()Sonunda ekleyin :

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

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

    Kredi, bu çözüme ulaşmama yardımcı olduğu için Hp93'e gidiyor. MUG4N'nin bu çözümü bulduğum cevabı hakkındaki yorumlarda, denemek .Any()yerine denemekten de bahsediyor .ToList(), ancak bu <T>, olduğu gibi yerine bir Boole veriyor <AGENCY>, bu yüzden muhtemelen yardımcı olmayacak.

  2. Çözüm - hata ayıklama seçeneklerinde farklı bir yol deneyin. "Herkese Açık Olmayan Üyeler"> "_internalQuery"> ObjectQuery> Sonuçlar Görünümü'ne tıklayıp değerlerimi bu şekilde alabileceğimi buldum.

görüntü açıklamasını buraya girin


9

MUG4N gerçekten doğru bir cevap verdi, ancak hata ayıklamada kod satırının üzerine gelirseniz, aşağıdaki gibi bir şeye bakıyor olabilirsiniz. Öyleyse, aşağıdaki resimde vurgulanan küçük yeniden değerlendir simgesine tıklayın ...

görüntü açıklamasını buraya girin

Not : Bu görüntüyü sabitleyerek elde ettim, normalde yeniden değerlendirme ikonu sol taraftaki sütunun aşağısında değil pencerenin ortasındadır.


Bu benim için hile yaptı. Bunu denemediğime inanamıyorum, cevap için teşekkürler.
petey m

2

Windows form denetimlerine erişim çoklu kullanımda İş Parçacığı güvenli olmadığından iş parçacığı güvenli arama yapmalısınız. Bu, Thread güvenli arama yapan ve İlerleme çubuğunu ayarlayan basit kodum.

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

Daha fazla bilgi için MSDN


1

Geçmek için bir sonraki geçici çözümü kullanıyorum:

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

Şimdi OtherThreadField için bir değerim var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.