Подтвердить что ты не робот

Visual Studio во время отладки: для оценки функции требуется, чтобы все потоки запускались

Я внезапно получаю странную ошибку при отладке. До сих пор переменная в окнах наблюдения отображалась правильно. Теперь я всегда получаю сообщение об ошибке в окнах просмотра:

Оценка функции требует запуска всех потоков

Я больше не могу проверять какие-либо переменные. Я не явно работаю с потоками. Что я могу сделать, чтобы это снова заработало?

Я уже отключил, как упоминалось на некоторых форумах, функцию: "Включить оценку свойства и другие неявные вызовы функций" в окне параметров отладчика. Но безуспешно, тогда я получаю ошибку:

Ошибка неявной оценки функции отключена пользователем

4b9b3361

Ответ 1

Из msdn форум:

Это не само по себе само по себе, а скорее особенность вашего отладчика. Для некоторых свойств требуется, чтобы код выполнялся для считывания свойства, но если для этого требуется взаимодействие по нескольким потокам, другим могут также потребоваться другие потоки. Отладчик не делает это автоматически, но, безусловно, может, с вашего разрешения. Просто нажмите значок маленькой оценки, и он запустит ваш код и оценит свойство.

enter image description here

Для получения дополнительной информации об этом поведении проверьте эту статью

Ответ 2

Я столкнулся с этой проблемой, когда просто пытался получить элементы из таблицы с именем "AGENCY", используя Entity Framework:

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

enter image description here

Если навести указатель мыши на агентства в режиме отладки, щелкнуть, чтобы развернуть параметры, и щелкнуть "Результаты", появится страшное "Оценка функции требует запуска всех потоков" со значком "Не вводить" в конце, когда щелчок мышью ничего не сделал.

2 возможных решения:

  1. Добавьте .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>, так что, вероятно, не будет Т помочь.

  2. Обходной путь - попробуйте другой путь в параметрах отладки. Я обнаружил, что могу нажать "Непубличные члены"> "_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.