デバッグ中のVisualStudio:関数の評価では、すべてのスレッドを実行する必要があります


92

デバッグ中に突然奇妙なエラーが発生します。これまで、ウォッチウィンドウの変数は正しく表示されていました。現在、ウォッチウィンドウに常にエラーメッセージが表示されます。

関数の評価では、すべてのスレッドを実行する必要があります

変数をチェックできなくなりました。私はスレッドを明示的に操作していません。再び機能させるにはどうすればよいですか?

いくつかのフォーラムで言及されているように、デバッガーのオプションウィンドウで「プロパティ評価およびその他の暗黙的な関数呼び出しを有効にする」機能を無効にしました。しかし、成功しないと、エラーが発生します。

ユーザーによって無効にされたエラー陰関数評価


リストのそのポイントを取得するには:Visual Studioを再起動しましたか?
MUG4N 2015年

はい、しました。再起動して同じ問題。
Maik 2015年

このアウトをチェック:stackoverflow.com/questions/4280604/...
MUG4N

たとえそれがうまくいくとしても、私はNET 4.xフレームワークを使いたいので、これは解決策にはなり得ません。この問題があるという理由だけでダウングレードしたくありません。なぜそれが少し前に機能していたのか疑問に思います。
Maik 2015年

私は同じ問題を抱えています。VS2013にはクリックできるボタンがありましたが、VS2015にはこのボタンがありません。
Spongman 2015年

回答:


112

msdnフォーラムから:

これはそれ自体がエラーではありませんが、デバッガーの機能の多くです。一部のプロパティでは、プロパティを読み取るためにコードを実行する必要がありますが、これにクロススレッドの相互作用が必要な場合は、他のスレッドも実行する必要があります。デバッガーはこれを自動的に実行しませんが、ユーザーの許可があれば確実に実行できます。小さな評価アイコンをクリックするだけで、コードが実行され、プロパティが評価されます。

ここに画像の説明を入力してください

この動作の詳細については、この優れた記事を確認してください


9
私はこの記事を読みました。クリックするボタンがないので、問題は正確ではありません。不思議なことに、今日Visual Studio 2015RCにアップグレードしてから機能していました。
Maik 2015年

1
ここでは、同じ問題:stackoverflow.com/questions/4460206/...
MUG4N

4
アイコンが表示されない場合は、ドロップダウンを使用してプロパティを調べるのではなく、変数/コマンドを変更してウォッチウィンドウからクエリを実行してみてください。たとえば、.ToList()またはを追加し.Any()ます。
hp 9318

4
私は必ず理由が、問題を修正し、私のクエリに.ToList()を呼び出していないんだ
J.Kirk。

1
@ J.Kirk。私は同じことを見つけました-ありがとう!私が使用していたvarIEnumerable<T>し、ちょうど割り当てるdb.AGENCY_TABLE.OrderBy(e => e.Name);-しかし、一度私が使用varして.ToList()(またはList<T>.ToList()も動作します)、それは結果が明らかに!
vapcguy 2018

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>、の代わりにブール値を与える<AGENCY>ので、おそらく役に立たないでしょう。

  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.