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


93

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

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

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

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

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


목록의 요점을 확인하려면 Visual Studio를 다시 시작 했습니까?
MUG4N

응 나는 했어. 다시 시작 및 동일한 문제.
Maik

이것을 확인하십시오 : stackoverflow.com/questions/4280604/…
MUG4N

작동하더라도 NET 4.x Framework를 사용하고 싶기 때문에 이것이 해결책이 될 수 없습니다. 이 문제 때문에 다운 그레이드하고 싶지 않습니다. 얼마 전에 왜 작동했는지 궁금합니다.
Maik

나는 같은 문제가 있습니다. VS2013에는 클릭 할 수있는 버튼이 있지만 VS2015에는이 버튼이 없습니다.
Spongman

답변:


113

로부터 MSDN 포럼 :

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

여기에 이미지 설명 입력

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


9
나는이 기사를 읽었다. 클릭 할 버튼이 없으므로 정확히 내가 가진 문제는 아닙니다. 이상하게도 오늘 Visual Studio 2015 RC로 업그레이드 한 이후로 작동했습니다.
Maik


4
아이콘이 표시되지 않으면 드롭 다운을 사용하여 속성을 탐색하는 대신 조사 식 창에서 쿼리를 실행하도록 변수 / 명령을 수정하십시오. 예를 들어, 추가 .ToList()또는 .Any().
Hp93

4
왜 그런지 모르겠지만 내 쿼리에서 .ToList ()를 호출하면 문제가 해결되었습니다
J.Kirk.

1
@J. 커크. 나는 똑같은 것을 찾았습니다-감사합니다! 나는 사용 var하고 IEnumerable<T>할당하고 db.AGENCY_TABLE.OrderBy(e => e.Name);있었지만 일단 사용 var하면 .ToList()(또는 작품 List<T>과 함께 .ToList()) 결과가 드러납니다!
vapcguy

23

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> 결과보기를 클릭하고 그런 방식으로 내 값을 가져올 수 있음을 발견했습니다.

여기에 이미지 설명 입력


9

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

여기에 이미지 설명 입력

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


이것은 나를 위해 트릭을했습니다. 답을 주셔서 감사합니다.
petey m

2

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


1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.