ডিবাগিংয়ের সময় ভিজ্যুয়াল স্টুডিও: ফাংশন মূল্যায়নের জন্য সমস্ত থ্রেড চালানো দরকার


93

আমি ডিবাগ করার সময় হঠাৎ একটি অদ্ভুত ত্রুটি পাচ্ছি। এখন পর্যন্ত ঘড়ির উইন্ডোতে ভেরিয়েবলটি সঠিকভাবে প্রদর্শিত হয়েছে। এখন আমি ঘড়ির উইন্ডোতে সর্বদা ত্রুটি বার্তা পাচ্ছি:

ফাংশন মূল্যায়নের জন্য সমস্ত থ্রেড চালানো দরকার

আমি আর কোনও ভেরিয়েবল চেক করতে পারছি না। আমি থ্রেড দিয়ে স্পষ্টভাবে কাজ করছি না। এটি আবার কাজ করতে আমি কী করতে পারি?

কিছু ফোরামে ফাংশনটিতে উল্লিখিত হিসাবে আমি ইতিমধ্যে অক্ষম করেছি: ডিবাগারের বিকল্প উইন্ডোতে "সম্পত্তি মূল্যায়ন এবং অন্যান্য অন্তর্নিহিত ফাংশন কলগুলি সক্ষম করুন"। তবে সাফল্য না পেয়ে আমি ত্রুটিটি পাচ্ছি:

ত্রুটি ইম্পিলিটিড ফাংশন মূল্যায়ন ব্যবহারকারীর দ্বারা অক্ষম


তালিকার সেই পয়েন্টটি পেতে: আপনি কি ভিজ্যুয়াল স্টুডিওটি আবার চালু করেছেন?
MUG4N

হ্যা, আমি করেছিলাম. পুনরায় চালু এবং একই সমস্যা।
মাইক 1'15

: এই খুঁজে বার করো stackoverflow.com/questions/4280604/...
MUG4N

যদিও এটি কাজ করে, এটি সমাধান হতে পারে না, কারণ আমি নেট 4.x ফ্রেমওয়ার্কটি ব্যবহার করতে চাই। আমি কেবল এই সমস্যাটি হ্রাস করতে চাই না। আমি ভাবছি কেন এটি কিছুক্ষণ আগে কাজ করছে।
মাইক 1'15

আমি একই সমস্যা আছে. ভিএস ২০১৩-এর একটি বোতাম ছিল যা আপনি ক্লিক করতে পারেন তবে ভিএস ২০১৫ এ এই বোতামটি নেই।
স্পঞ্জম্যান

উত্তর:


113

থেকে MSDN ফোরাম:

এটি নিজের মধ্যে এবং এটি একটি ত্রুটি নয়, তবে আপনার ডিবাগারের আরও একটি বৈশিষ্ট্য। কিছু সম্পত্তি সম্পত্তি পড়ার জন্য কোড সম্পাদন করা প্রয়োজন, তবে যদি এটি ক্রস-থ্রেড ইন্টারঅ্যাকশন প্রয়োজন, তবে অন্যান্য থ্রেডগুলিও চালাতে হতে পারে। ডিবাগারটি স্বয়ংক্রিয়ভাবে এটি করে না, তবে অবশ্যই আপনার অনুমতি নিয়ে এটি করতে পারে। সামান্য মূল্যায়ন আইকনটি ক্লিক করুন এবং এটি আপনার কোড চালাবে এবং সম্পত্তিটি মূল্যায়ন করবে।

এখানে চিত্র বর্ণনা লিখুন

এই আচরণ সম্পর্কে আরও তথ্যের জন্য এই দুর্দান্ত নিবন্ধটি পরীক্ষা করুন check


9
আমি এই নিবন্ধটি পড়েছি। আমার কাছে ক্লিক করার মতো কোনও বোতাম নেই, তাই আমার কাছে ঠিক সমস্যাটি নয়। আশ্চর্যের বিষয়টি হ'ল, আজ আমি ভিজ্যুয়াল স্টুডিও 2015 আরসিতে আপগ্রেড করার পরে এটি কাজ করছে।
মাইক

4
এখানে একই সমস্যা: stackoverflow.com/questions/4460206/...
MUG4N

4
যদি আপনি কোনও আইকন না দেখেন তবে এর বৈশিষ্ট্যগুলি অন্বেষণ করতে ড্রপ ডাউন ব্যবহার না করে ওয়াচ উইন্ডো থেকে কোয়েরিটি সম্পাদন করতে ভেরিয়েবল / কমান্ডটি সংশোধন করে দেখুন। উদাহরণস্বরূপ, যোগ .ToList()বা .Any()
Hp93

4
আমি নিশ্চিত না কেন কেন কল করছি .ToList () আমার প্রশ্নের সমাধানে বিষয়টি স্থির করে
J.Kirk।

4
@ জে.কির্ক আমি একই জিনিস পেয়েছি - ধন্যবাদ! আমি ব্যবহার ছিল 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. কার্যক্ষম - ডিবাগ বিকল্পগুলিতে একটি পৃথক পাথ চেষ্টা করুন। আমি দেখতে পেলাম যে আমি "অ-সর্বজনীন সদস্য"> "_internQuery"> অবজেক্টকোয়ারি> ফলাফল দেখুন এবং আমার মানগুলি সেভাবে পেতে পারি।

এখানে চিত্র বর্ণনা লিখুন


9

MUG4N প্রকৃতপক্ষে একটি সঠিক উত্তর সরবরাহ করেছে তবে আপনি যদি ডিবাগের কোড লাইনের উপরে ঘুরে দেখেন তবে আপনি নীচের মতো কিছু খুঁজছেন। যদি তা হয় তবে নীচের চিত্রটিতে হাইলাইট করা সামান্য পুনরায় মূল্যায়ন আইকনটি ক্লিক করুন ...

এখানে চিত্র বর্ণনা লিখুন

বিশেষ দ্রষ্টব্য : আমি পিন করে আপনি এই ছবিটির প্রাপ্ত, সাধারণত পুনরায় মূল্যায়নের icone উইন্ডোর মাঝখানে এবং বাম দিকের কলামে নিচে নয়।


এটি আমার জন্য কৌশলটি করেছে। আমি বিশ্বাস করি না যে আমি এটি চেষ্টা করিনি, উত্তরের জন্য ধন্যবাদ।
পেটি এম

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");
    }
}

আরও তথ্যের জন্য এমএসডিএন


1

আমি পাশ করার জন্য পরবর্তী কাজের মতো ব্যবহার করি:

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

এখন আমার অন্যান্য মূল্য আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.