デバッグ中に突然奇妙なエラーが発生します。これまで、ウォッチウィンドウの変数は正しく表示されていました。現在、ウォッチウィンドウに常にエラーメッセージが表示されています。
関数の評価には、すべてのスレッドの実行が必要です
もう変数をチェックすることはできません。私はスレッドを明示的に操作していません。再び機能させるにはどうすればよいですか?
一部のフォーラムで言及されているように、デバッガーのオプションウィンドウで「プロパティ評価とその他の暗黙的な関数呼び出しを有効にする」という機能を既に無効にしました。しかし、成功せずに、エラーが発生しています:
ユーザーがエラーの暗黙的な関数評価を無効にしました
Entity Frameworkを使用して「AGENCY」というテーブルからアイテムを取得しようとすると、この問題に遭遇しました。
var agencies = db.AGENCY.OrderBy(e => e.FULLNAME);
デバッグモードで代理店にカーソルを合わせ、オプションをクリックして展開し、[結果]をクリックすると、恐ろしい[関数の評価にはすべてのスレッドの実行が必要]が表示されます。
2つの可能な解決策:
最後に.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>
の代わりにブールを与えるので、おそらく助けにはなりません。
回避策-デバッグオプションで別のパスを試してください。 「非公開メンバー」>「_ internalQuery」> ObjectQuery>結果ビューをクリックして、その方法で値を取得できることがわかりました。
マルチスレッドでは、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
次の回避策を使用して合格します。
var OtherThreadField = "";
Invoke(new MethodInvoker(delegate
{
OtherThreadField = ExecuteNeededMEthod();
}));
今、OtherThreadFieldの値があります。