Visual Studio во время отладки: для оценки функции требуется, чтобы все потоки запускались
Я внезапно получаю странную ошибку при отладке. До сих пор переменная в окнах наблюдения отображалась правильно. Теперь я всегда получаю сообщение об ошибке в окнах просмотра:
Оценка функции требует запуска всех потоков
Я больше не могу проверять какие-либо переменные. Я не явно работаю с потоками. Что я могу сделать, чтобы это снова заработало?
Я уже отключил, как упоминалось на некоторых форумах, функцию: "Включить оценку свойства и другие неявные вызовы функций" в окне параметров отладчика. Но безуспешно, тогда я получаю ошибку:
Ошибка неявной оценки функции отключена пользователем
Ответы
Ответ 1
Из msdn форум:
Это не само по себе само по себе, а скорее особенность вашего отладчика.
Для некоторых свойств требуется, чтобы код выполнялся для считывания свойства, но если для этого требуется взаимодействие по нескольким потокам, другим могут также потребоваться другие потоки. Отладчик не делает это автоматически, но, безусловно, может, с вашего разрешения.
Просто нажмите значок маленькой оценки, и он запустит ваш код и оценит свойство.
![enter image description here]()
Для получения дополнительной информации об этом поведении проверьте эту статью
Ответ 2
Я столкнулся с этой проблемой, когда просто пытался получить элементы из таблицы с именем "AGENCY", используя Entity Framework:
var agencies = db.AGENCY.OrderBy(e => e.FULLNAME);
![enter image description here]()
Если навести указатель мыши на агентства в режиме отладки, щелкнуть, чтобы развернуть параметры, и щелкнуть "Результаты", появится страшное "Оценка функции требует запуска всех потоков" со значком "Не вводить" в конце, когда щелчок мышью ничего не сделал.
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"> "Представление результатов" и таким образом получить свои значения.
![enter image description here]()
Ответ 3
MUG4N действительно дал правильный ответ, однако, если вы наводите курсор мыши на строку кода в отладке, вы можете посмотреть на что-то подобное ниже. Если это так, нажмите маленький значок переоценки, выделенный на изображении ниже...
![enter image description here]()
NB: Я получил это изображение, закрепив его, обычно переоценка находится в середине окна, а не внизу левой колонки.
Ответ 4
Я использую следующий обходной путь:
var OtherThreadField = "";
Invoke(new MethodInvoker(delegate
{
OtherThreadField = ExecuteNeededMEthod();
}));
Теперь у меня есть значение для OtherThreadField.
Ответ 5
Вы должны сделать потокобезопасный вызов, потому что доступ к элементам управления Windows не является потокобезопасным при многопоточности.
Это мой простой код, который обеспечивает безопасный вызов Thread и устанавливает индикатор выполнения.
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
Ответ 6
У меня было то же сообщение об ошибке при использовании EF в другом слое (сборке). Это разрешается после добавления тега строки подключения в App.Config слоя!
Ответ 7
Este erro pode ocorrer quando retorna algum campo null e se espera not null.