web-dev-qa-db-ja.com

デバッグ中のVisual Studio:関数の評価には、実行するすべてのスレッドが必要です

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

関数の評価には、すべてのスレッドの実行が必要です

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

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

ユーザーがエラーの暗黙的な関数評価を無効にしました

62
Maik

msdn フォーラムから:

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

enter image description here

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

75
MUG4N

Entity Frameworkを使用して「AGENCY」というテーブルからアイテムを取得しようとすると、この問題に遭遇しました。

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

enter image description here

デバッグモードで代理店にカーソルを合わせ、オプションをクリックして展開し、[結果]をクリックすると、恐ろしい[関数の評価にはすべてのスレッドの実行が必要]が表示されます。

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>結果ビューをクリックして、その方法で値を取得できることがわかりました。

enter image description here

11
vapcguy

MUG4Nは確かに正しい答えを提供しましたが、デバッグでコード行にカーソルを合わせると、次のようなものが表示される場合があります。その場合、下の画像で強調表示されている小さな再評価アイコンをクリックします...

enter image description here

NB:ピン留めによってこの画像を取得しました。通常、再評価アイコンはウィンドウの中央にあり、左側の列ではありません。

6
Ewan

マルチスレッドでは、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の値があります。

1
sh2dow