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
Jawaban:
Dari forum msdn :
Untuk detail lebih lanjut tentang perilaku ini periksa artikel yang sangat baik ini
sumber
.ToList()
atau.Any()
.var
danIEnumerable<T>
dan hanya menugaskandb.AGENCY_TABLE.OrderBy(e => e.Name);
- tetapi setelah saya menggunakanvar
dengan.ToList()
(atauList<T>
dengan.ToList()
juga bekerja), hasilnya mengungkapkan!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);
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:
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.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.
sumber
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 ...
NB : Saya mendapatkan gambar ini dengan menyematkan, biasanya icone evaluasi ulang berada di tengah jendela dan bukan di kolom kiri.
sumber
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
sumber
Saya menggunakan solusi berikutnya untuk lulus:
var OtherThreadField = ""; Invoke(new MethodInvoker(delegate { OtherThreadField = ExecuteNeededMEthod(); }));
Sekarang saya memiliki nilai untuk OtherThreadField.
sumber