Visual Studio trong khi gỡ lỗi: Đánh giá chức năng yêu cầu tất cả các luồng chạy


92

Tôi đột nhiên nhận được một lỗi lạ khi gỡ lỗi. Cho đến nay, biến trong cửa sổ đồng hồ đã được hiển thị chính xác. Bây giờ tôi luôn nhận được thông báo lỗi trong cửa sổ đồng hồ:

Đánh giá chức năng yêu cầu tất cả các luồng chạy

Tôi không thể kiểm tra bất kỳ biến nào nữa. Tôi không rõ ràng làm việc với các chủ đề. Tôi có thể làm gì để nó hoạt động trở lại?

Tôi đã vô hiệu hóa như đã đề cập trong một số diễn đàn chức năng: "Bật tính năng Đánh giá thuộc tính và các cuộc gọi hàm ngầm khác" trong cửa sổ tùy chọn của trình gỡ lỗi. Nhưng không thành công, sau đó tôi gặp lỗi:

Lỗi đánh giá hàm ẩn do người dùng tắt


Để đạt được điểm đó của danh sách: Bạn đã khởi động lại Visual Studio chưa?
MUG4N

Vâng, tôi đã làm. Đã khởi động lại và cùng một vấn đề.
Maik


Ngay cả khi nó hoạt động, đây không thể là giải pháp, vì tôi muốn sử dụng NET 4.x Framework. Tôi không muốn hạ cấp chỉ vì nếu vấn đề này. Tôi đang tự hỏi tại sao nó hoạt động cách đây một thời gian.
Maik

tôi có cùng một vấn đề. VS2013 có một nút bạn có thể nhấp vào, nhưng VS2015 không có nút này.
Spongman

Câu trả lời:


112

Từ diễn đàn msdn :

Đây không phải là một lỗi, mà là một tính năng của trình gỡ lỗi. Một số thuộc tính yêu cầu mã phải được thực thi để thuộc tính được đọc, nhưng nếu điều này yêu cầu tương tác giữa các luồng thì các luồng khác cũng có thể phải chạy. Trình gỡ lỗi không tự động làm điều này, nhưng chắc chắn có thể, với sự cho phép của bạn. Chỉ cần nhấp vào biểu tượng đánh giá nhỏ và nó sẽ chạy mã của bạn và đánh giá thuộc tính.

nhập mô tả hình ảnh ở đây

Để biết thêm chi tiết về hành vi này, hãy kiểm tra bài viết xuất sắc này


9
Tôi đã đọc bài báo này. Tôi không có nút nào như vậy để nhấp, Vì vậy, không chính xác vấn đề tôi gặp phải. Thật kỳ lạ là nó đã hoạt động kể từ khi tôi nâng cấp lên Visual Studio 2015 RC ngày hôm nay.
Maik

1
Vấn đề tương tự ở đây: stackoverflow.com/questions/4460206/…
MUG4N

4
Nếu bạn không thấy bất kỳ biểu tượng nào, hãy thử sửa đổi biến / lệnh để thực hiện truy vấn từ cửa sổ theo dõi, thay vì sử dụng trình đơn thả xuống để khám phá các thuộc tính của nó. Ví dụ, thêm .ToList()hoặc .Any().
Hp93,

4
Tôi không chắc tại sao nhưng việc gọi .ToList () trên truy vấn của tôi đã khắc phục được sự cố
J.Kirk.

1
@ J.Kirk. Tôi đã tìm thấy điều tương tự - cảm ơn! Tôi đã sử dụng varIEnumerable<T>chỉ gán db.AGENCY_TABLE.OrderBy(e => e.Name);- nhưng một khi tôi sử dụng varvới .ToList()(hoặc List<T>với .ToList()các tác phẩm), nó sẽ tiết lộ kết quả!
vapcguy

23

Tôi đã gặp sự cố này khi cố gắng lấy các mục từ bảng có tên "ĐẠI LÝ" bằng cách sử dụng Khung thực thể:

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

nhập mô tả hình ảnh ở đây

Di chuột qua các đại lý ở chế độ gỡ lỗi, nhấp để mở rộng các tùy chọn và nhấp vào Kết quả sẽ đưa ra thông báo đáng sợ "Đánh giá chức năng yêu cầu tất cả các chuỗi để chạy" với biểu tượng "Không nhập" ở cuối mà nhấp vào không làm gì cả.

2 giải pháp khả thi:

  1. Thêm .ToList()vào cuối:

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

    List<AGENCY_TABLE> agencies = db.AGENCY_TABLE.OrderBy(e => e.FULLNAME).ToList();

    Tín dụng chuyển đến Hp93 để giúp tôi đi đến giải pháp này. Trong các nhận xét về câu trả lời của MUG4N nơi tôi tìm thấy giải pháp này, nó cũng đề cập đến việc thử .Any()thay vì .ToList(), nhưng điều này đưa ra một Boolean thay vì một <T>, giống như <AGENCY>vậy, vì vậy nó có thể sẽ không hữu ích.

  2. Cách giải quyết - hãy thử một đường dẫn khác trong các tùy chọn gỡ lỗi. Tôi thấy rằng tôi có thể nhấp vào "Thành viên không công khai"> "_internalQuery"> ObjectQuery> Chế độ xem kết quả và nhận các giá trị của mình theo cách đó.

nhập mô tả hình ảnh ở đây


9

MUG4N thực sự đã cung cấp một câu trả lời chính xác, tuy nhiên nếu bạn di chuột qua dòng mã trong gỡ lỗi, bạn có thể nhìn thấy thứ gì đó giống như bên dưới. Nếu vậy, hãy nhấp vào biểu tượng đánh giá lại nhỏ được đánh dấu trong hình ảnh bên dưới ...

nhập mô tả hình ảnh ở đây

NB : Tôi thu được hình ảnh này bằng cách ghim, thông thường icone đánh giá lại nằm ở giữa cửa sổ chứ không phải ở cột bên trái.


Điều này đã làm các mẹo cho tôi. Cant tin rằng tôi đã không thử điều này, cảm ơn vì câu trả lời.
petey m

2

Bạn nên thực hiện cuộc gọi an toàn luồng vì việc truy cập điều khiển biểu mẫu Windows không an toàn cho luồng trong đa luồng. Đây là mã đơn giản của tôi giúp thực hiện cuộc gọi An toàn của Thread và đặt thanh Tiến trình.

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

Để biết thêm thông tin MSDN


1

Tôi sử dụng cách giải quyết tiếp theo để vượt qua:

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

Bây giờ tôi có một giá trị cho OtherThreadField.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.