डिबगिंग के दौरान दृश्य स्टूडियो: फ़ंक्शन मूल्यांकन को चलाने के लिए सभी थ्रेड्स की आवश्यकता होती है


92

डिबगिंग करते समय मुझे अचानक एक अजीब त्रुटि हो रही है। अब तक घड़ी की खिड़कियों में चर को सही ढंग से दिखाया गया है। अब मुझे घड़ी की खिड़कियों में हमेशा त्रुटि संदेश मिल रहा है:

फ़ंक्शन मूल्यांकन को चलाने के लिए सभी थ्रेड्स की आवश्यकता होती है

मैं अब किसी भी चर की जांच करने में सक्षम नहीं हूं। मैं स्पष्ट रूप से थ्रेड्स के साथ काम नहीं कर रहा हूं। मैं इसे फिर से काम करने के लिए क्या कर सकता हूं?

डिबगर के विकल्प विंडो में "पहले से ही कुछ मंचों में उल्लिखित है, जो फ़ंक्शन:" संपत्ति मूल्यांकन और अन्य निहित फ़ंक्शन कॉल सक्षम करें "। लेकिन सफलता के बिना, तो मुझे त्रुटि मिल रही है:

उपयोगकर्ता द्वारा अक्षम त्रुटि फ़ंक्शन मूल्यांकन मूल्यांकन


सूची के उस बिंदु को पाने के लिए: क्या आपने विजुअल स्टूडियो को फिर से शुरू किया है?
MUG4N

हाँ, मैंने किया। पुनः आरंभ और एक ही मुद्दा।
माईक

इसे देखें: stackoverflow.com/questions/4280604/…
MUG4N

यहां तक ​​कि अगर यह काम करेगा, यह समाधान नहीं हो सकता है, जैसा कि मैं नेट 4.x फ्रेमवर्क का उपयोग करना चाहता हूं। मैं डाउनग्रेड नहीं करना चाहता क्योंकि अगर यह मुद्दा है। मैं सोच रहा हूं कि यह कुछ समय पहले क्यों काम कर रहा था।
माईक

मेरे साथ भी वही दिक्कत है। VS2013 में एक बटन था जिसे आप क्लिक कर सकते हैं, लेकिन VS2015 में यह बटन नहीं है।
स्पॉन्जमैन

जवाबों:


112

से MSDN मंच:

यह अपने आप में एक त्रुटि नहीं है, लेकिन आपके डीबगर की एक विशेषता है। संपत्ति को पढ़ने के लिए कुछ गुणों को निष्पादित करने के लिए कोड की आवश्यकता होती है, लेकिन यदि इसके लिए क्रॉस-थ्रेड इंटरैक्शन की आवश्यकता होती है, तो अन्य थ्रेड्स को भी चलाना पड़ सकता है। डिबगर स्वचालित रूप से ऐसा नहीं करता है, लेकिन निश्चित रूप से आपकी अनुमति के साथ कर सकता है। बस थोड़ा मूल्यांकन आइकन पर क्लिक करें और यह आपके कोड को चलाएगा और संपत्ति का मूल्यांकन करेगा।

यहाँ छवि विवरण दर्ज करें

इस व्यवहार के बारे में अधिक जानकारी के लिए इस उत्कृष्ट लेख को देखें


9
मैंने इस लेख को पढ़ा। मेरे पास क्लिक करने के लिए ऐसा कोई बटन नहीं है, इसलिए मेरे पास बिलकुल भी समस्या नहीं है। अजीब पर्याप्त है, क्योंकि यह तब से काम कर रहा था जब मैंने विजुअल स्टूडियो 2015 आरसी में अपग्रेड किया था।
मायिक

1
यहाँ एक ही मुद्दा: stackoverflow.com/questions/4460206/…
MUG4N

4
यदि आपको कोई आइकन दिखाई नहीं देता है, तो गुण देखने के लिए ड्रॉप डाउन का उपयोग करने के बजाय, वॉच विंडो से क्वेरी को निष्पादित करने के लिए चर / कमांड को संशोधित करने का प्रयास करें। उदाहरण के लिए, जोड़ना .ToList()या .Any()
Hp93

4
मुझे यकीन नहीं है कि क्यों लेकिन कॉल कर रहा हूं। मेरे प्रश्न पर .TLList () ने मुद्दा तय किया
जे.किर्क।

1
@ J.Kirk। मुझे एक ही बात मिली - धन्यवाद! मैं उपयोग करती रही है varऔर IEnumerable<T>और बस बताए db.AGENCY_TABLE.OrderBy(e => e.Name);- लेकिन एक बार मैं प्रयोग किया जाता है varके साथ .ToList()(या List<T>के साथ .ToList()भी काम करता है), यह परिणाम से पता चलता है!
vapcguy

23

मैं इस मुद्दे में भाग गया जब सिर्फ "फ्रेमवर्क" नामक एक आइटम से एंटिटी फ्रेमवर्क का उपयोग करने की कोशिश कर रहा था:

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>, जैसा <AGENCY>है, इसलिए यह संभवतः मदद नहीं करेगा।

  2. समाधान - डिबग विकल्पों में एक अलग पथ का प्रयास करें। मैंने पाया कि मैं "गैर-सार्वजनिक सदस्यों"> "_internalQuery"> ObjectQuery> परिणाम देखें पर क्लिक कर सकता हूं और इस तरह से अपने मूल्यों को प्राप्त कर सकता हूं।

यहाँ छवि विवरण दर्ज करें


9

MUG4N ने वास्तव में एक सही उत्तर प्रदान किया है, लेकिन यदि आप डिबग में कोड की लाइन पर होवर करते हैं, तो आप नीचे दिए गए कुछ को देख सकते हैं। यदि हां, तो नीचे की छवि में हाइलाइट किए गए छोटे पुनर्मूल्यांकन आइकन पर क्लिक करें ...

यहाँ छवि विवरण दर्ज करें

एनबी : मैंने इस छवि को पिन करके प्राप्त किया, आम तौर पर पुनर्मूल्यांकन का आइकॉन खिड़की के बीच में होता है न कि बाएं हाथ के स्तंभ के नीचे।


इसने मेरे लिए चाल चली। खिचड़ी भाषा का मानना ​​है कि मैंने यह कोशिश नहीं की, उत्तर के लिए धन्यवाद।
पेटीएम

2

आपको थ्रेड सेफ कॉल करना चाहिए क्योंकि विंडोज फॉर्म कंट्रोल एक्सेस करना थ्रेड मल्टीथ्रेडिंग में सुरक्षित नहीं है। यह मेरा सरल कोड है जो थ्रेड को सुरक्षित कॉल करता है और प्रोग्रेस बार सेट करता है।

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 के लिए एक मूल्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.