Visual Studio selama Debugging: Evaluasi fungsi memerlukan semua utas untuk dijalankan

93

Saya tiba-tiba mendapatkan kesalahan aneh saat melakukan debug. Sampai saat ini variabel di jendela jam telah ditampilkan dengan benar. Sekarang saya selalu mendapatkan pesan kesalahan di jendela arloji:

Evaluasi fungsi membutuhkan semua utas untuk dijalankan

Saya tidak dapat memeriksa variabel apa pun lagi. Saya tidak secara eksplisit bekerja dengan utas. Apa yang dapat saya lakukan untuk membuatnya berfungsi kembali?

Saya telah menonaktifkan fungsi seperti yang disebutkan di beberapa forum: "Aktifkan Evaluasi properti dan Panggilan fungsi implisit lainnya" di jendela opsi debugger. Tetapi tanpa hasil, maka saya mendapatkan kesalahan:

Kesalahan Evaluasi Fungsi Implisit dinonaktifkan oleh pengguna

Maik
sumber
Untuk mendapatkan titik itu dari daftar: Sudahkah Anda memulai ulang Visual Studio?
MUG4N
Ya saya lakukan. Masalah yang dimulai ulang dan sama.
Maik
Bahkan jika itu akan berhasil, ini tidak bisa menjadi solusi, karena saya ingin menggunakan Framework NET 4.x. Saya tidak ingin downgrade hanya karena masalah ini. Saya bertanya-tanya mengapa ini berhasil beberapa waktu lalu.
Maik
saya memiliki masalah yang sama. VS2013 memiliki tombol yang dapat Anda klik, tetapi VS2015 tidak memiliki tombol ini.
Spongman

Jawaban:

113

Dari forum msdn :

Ini bukan kesalahan itu sendiri, tetapi lebih merupakan fitur debugger Anda. Beberapa properti memerlukan kode untuk dieksekusi agar properti dapat dibaca, tetapi jika ini memerlukan interaksi lintas utas, utas lain mungkin juga harus dijalankan. Debugger tidak melakukan ini secara otomatis, tetapi tentu saja bisa, dengan izin Anda. Cukup klik ikon evaluasi kecil dan itu akan menjalankan kode Anda dan mengevaluasi properti.

masukkan deskripsi gambar di sini

Untuk detail lebih lanjut tentang perilaku ini periksa artikel yang sangat baik ini

MUG4N
sumber
9
Saya memang membaca artikel ini. Saya tidak memiliki tombol seperti itu untuk diklik, Jadi bukan masalah yang saya miliki. Anehnya, itu berfungsi sejak saya memutakhirkan ke Visual Studio 2015 RC hari ini.
Maik
1
Masalah yang sama di sini: stackoverflow.com/questions/4460206/…
MUG4N
4
Jika Anda tidak melihat ikon apa pun, coba ubah variabel / perintah untuk menjalankan kueri dari jendela tonton, alih-alih menggunakan tarik-turun untuk menjelajahi propertinya. Misalnya, menambahkan .ToList()atau .Any().
Hp93
4
Saya tidak yakin mengapa tetapi memanggil .ToList () pada kueri saya memperbaiki masalah
J.Kirk.
1
@ J.Kirk. Saya menemukan hal yang sama - terima kasih! Saya telah menggunakan vardan IEnumerable<T>dan hanya menugaskan db.AGENCY_TABLE.OrderBy(e => e.Name);- tetapi setelah saya menggunakan vardengan .ToList()(atau List<T>dengan .ToList()juga bekerja), hasilnya mengungkapkan!
vapcguy
23

Saya mengalami masalah ini saat hanya mencoba mendapatkan item dari tabel yang disebut "AGENCY" menggunakan Entity Framework:

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

masukkan deskripsi gambar di sini

Mengarahkan kursor ke agensi dalam mode debug, mengklik untuk memperluas opsi, dan mengklik Hasil akan memunculkan pesan "Evaluasi fungsi yang mengharuskan semua utas berjalan" dengan ikon "Jangan Masuk" di bagian akhir yang, di mana, mengklik tidak melakukan apa pun.

2 solusi yang mungkin:

  1. Tambahkan .ToList()di akhir:

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

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

    Penghargaan diberikan kepada Hp93 karena telah membantu saya menemukan solusi ini. Dalam komentar pada jawaban MUG4N di mana saya menemukan solusi ini, itu juga menyebutkan mencoba .Any()bukan .ToList(), tapi ini memberikan Boolean bukannya <T>, seperti <AGENCY>adalah, sehingga mungkin tidak akan membantu.

  2. Solusi - coba jalur lain dalam opsi debug. Saya menemukan bahwa saya bisa mengklik "Anggota Non-Publik"> "_internalQuery"> ObjectQuery> Tampilan Hasil dan mendapatkan nilai saya dengan cara itu.

masukkan deskripsi gambar di sini

vapcguy
sumber
9

MUG4N memang memberikan jawaban yang benar, namun jika Anda mengarahkan kursor ke baris kode di debug, Anda mungkin melihat sesuatu seperti di bawah ini. Jika demikian, klik ikon evaluasi ulang kecil yang disorot pada gambar di bawah ...

masukkan deskripsi gambar di sini

NB : Saya mendapatkan gambar ini dengan menyematkan, biasanya icone evaluasi ulang berada di tengah jendela dan bukan di kolom kiri.

Ewan
sumber
Ini melakukan trik untuk saya. Tidak percaya saya tidak mencoba ini, terima kasih atas jawabannya.
petey m
2

Anda harus melakukan panggilan aman utas karena mengakses kontrol formulir Windows tidak aman utas dalam multithreading. Ini adalah kode sederhana saya yang membuat panggilan aman Thread dan menyetel bilah Kemajuan.

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

Untuk informasi lebih lanjut MSDN

TAHA SULTAN TEMURI
sumber
1

Saya menggunakan solusi berikutnya untuk lulus:

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

Sekarang saya memiliki nilai untuk OtherThreadField.

sh2dow
sumber