program tip

디버깅 중 Visual Studio : 함수를 평가하려면 모든 스레드를 실행해야합니다.

radiobox 2020. 11. 28. 08:59
반응형

디버깅 중 Visual Studio : 함수를 평가하려면 모든 스레드를 실행해야합니다.


디버깅하는 동안 갑자기 이상한 오류가 발생합니다. 지금까지 조사 식 창에있는 변수가 올바르게 표시되었습니다. 이제 시계 창에 항상 오류 메시지가 나타납니다.

함수 평가에는 모든 스레드가 실행되어야합니다.

더 이상 변수를 확인할 수 없습니다. 나는 스레드로 명시 적으로 작업하지 않습니다. 다시 작동하게하려면 어떻게해야합니까?

일부 포럼에서 언급했듯이 디버거의 옵션 창에서 "속성 평가 및 기타 암시 적 함수 호출 활성화"기능을 이미 비활성화했습니다. 그러나 성공하지 못하면 오류가 발생합니다.

사용자가 오류 암시 적 기능 평가를 비활성화했습니다.


로부터 MSDN 포럼 :

이것은 그 자체로 오류가 아니라 디버거의 기능에 더 가깝습니다. 일부 속성은 속성을 읽기 위해 코드를 실행해야하지만 스레드 간 상호 작용이 필요한 경우 다른 스레드도 실행해야 할 수 있습니다. 디버거는이 작업을 자동으로 수행하지 않지만 사용자의 허락하에 가능합니다. 작은 평가 아이콘을 클릭하면 코드가 실행되고 속성이 평가됩니다.

여기에 이미지 설명 입력

이 동작에 대한 자세한 내용은이 우수 기사를 확인 하십시오.


Entity Framework를 사용하여 "AGENCY"라는 테이블에서 항목을 가져 오려고 할 때이 문제가 발생했습니다.

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

여기에 이미지 설명 입력

디버그 모드에서 에이전시 위로 마우스를 가져 가서 옵션을 확장하고 결과를 클릭하면 "함수 평가를 실행하려면 모든 스레드가 필요합니다"라는 무서운 메시지가 표시되고 끝에 "입력하지 않음"아이콘이 표시됩니다.

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>, like <AGENCY>is 대신 부울 값을 제공 하므로 도움이되지 않을 것입니다.

  2. 해결 방법-디버그 옵션에서 다른 경로를 시도하십시오. "비공개 구성원"> "_internalQuery"> ObjectQuery> 결과보기를 클릭하고 그런 방식으로 내 값을 가져올 수 있음을 발견했습니다.

여기에 이미지 설명 입력


MUG4N은 실제로 정답을 제공했지만 디버그에서 코드 줄 위로 마우스를 가져 가면 아래와 같은 내용을 볼 수 있습니다. 그렇다면 아래 이미지에 강조 표시된 작은 재평가 아이콘을 클릭하십시오.

여기에 이미지 설명 입력

주의 :이 이미지는 고정을 통해 얻었습니다. 일반적으로 재평가 아이콘은 왼쪽 열이 아닌 창 중앙에 있습니다.


다음 해결 방법을 사용하여 전달합니다.

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

이제 OtherThreadField에 대한 값이 있습니다.


Windows 양식 컨트롤에 액세스하는 것은 다중 스레딩에서 스레드로부터 안전하지 않기 때문에 스레드 안전 호출을 만들어야합니다. 이것은 스레드 안전 호출을 만들고 진행률 표시 줄을 설정하는 간단한 코드입니다.

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

참고 URL : https://stackoverflow.com/questions/29985150/visual-studio-during-debugging-the-function-evaluation-requires-all-threads-to

반응형