При отладке внезапно появляется странная ошибка. До сих пор переменная в окнах просмотра отображалась правильно. Теперь я всегда получаю сообщение об ошибке в окнах часов:
Оценка функции требует, чтобы все потоки работали
Я больше не могу проверить какие-либо переменные. Я не работаю с потоками явно. Что я могу сделать, чтобы он снова заработал?
Я уже отключил, как упоминалось на некоторых форумах, функцию: «Включить оценку свойств и другие неявные вызовы функций» в окне параметров отладчика. Но без успеха я получаю сообщение об ошибке:
Ошибка Неявная оценка функции отключена пользователем
Ответы:
С форума msdn :
Дополнительные сведения об этом поведении см. В этой отличной статье.
источник
.ToList()
или.Any()
.var
иIEnumerable<T>
просто назначалdb.AGENCY_TABLE.OrderBy(e => e.Name);
- но как только я использовалvar
с.ToList()
(илиList<T>
с.ToList()
тоже работает), это показывает результат!Я столкнулся с этой проблемой, когда просто пытался получить элементы из таблицы под названием «AGENCY» с помощью Entity Framework:
var agencies = db.AGENCY.OrderBy(e => e.FULLNAME);
Если навести указатель мыши на агентства в режиме отладки, щелкнуть, чтобы развернуть параметры, и щелкнуть «Результаты», появится ужасное сообщение «Оценка функции требует запуска всех потоков» со значком «Не вводить» в конце, нажатие на котором ничего не дало.
2 возможных решения:
Добавьте
.ToList()
в конце:var agencies = db.AGENCY_TABLE.OrderBy(e => e.FULLNAME).ToList();
List<AGENCY_TABLE> agencies = db.AGENCY_TABLE.OrderBy(e => e.FULLNAME).ToList();
Благодарим Hp93 за помощь в поиске этого решения. В комментариях к ответу MUG4N, где я нашел это решение, также упоминается попытка
.Any()
вместо.ToList()
, но это дает логическое значение вместо<T>
, как<AGENCY>
есть, поэтому это, вероятно, не поможет.Обходной путь - попробуйте другой путь в параметрах отладки. Я обнаружил, что могу щелкнуть «Непубличные члены»> «_internalQuery»> ObjectQuery> Просмотр результатов и получить таким образом свои значения.
источник
MUG4N действительно дал правильный ответ, однако, если вы наведете курсор на строку кода во время отладки, вы можете увидеть что-то вроде следующего. Если да, щелкните маленький значок повторной оценки, выделенный на изображении ниже ...
NB : Я получил это изображение путем закрепления, обычно значок переоценки находится в середине окна, а не в левом столбце.
источник
Вы должны сделать потокобезопасный вызов, потому что доступ к элементам управления формы Windows не является потокобезопасным при многопоточности. Это мой простой код, который делает вызов Thread-safe и устанавливает индикатор выполнения.
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"); } }
Для получения дополнительной информации MSDN
источник
Я использую следующий обходной путь:
var OtherThreadField = ""; Invoke(new MethodInvoker(delegate { OtherThreadField = ExecuteNeededMEthod(); }));
Теперь у меня есть значение OtherThreadField.
источник