CheckForIllegalCrossThreadCalls = false
スレッド間のアクセスを許可しますが、これは不安定です。注意して使用してください
次のインターフェイスを設定し、「button1」をクリックして、labelの値を変更し、ボタンのクリックイベント関数がCheckForIllegalCrossThreadCalls = falseを追加しない場合に、スレッド実行メソッドを変更するスレッドを設定してlabelの値を変更します。 、デフォルトではクロススレッドアクセスは許可されておらず、例外のキャッチによってプロンプトが表示されます。
スレッド間操作は無効です。コントロールラベルを作成したスレッドからアクセスしないでください。
コントロールラベルを作成するスレッドは、ページが開始するメインスレッドであり、ラベルの値を変更して、作成した別のスレッド、つまりクロススレッド操作を介してアクセスします。システムは
、ボタンのクリックイベントでこれを実行することを許可していません。文がForm1.CheckForIllegalCrossThreadCalls = falseである場合、ラベルの値が変更されたことが検出されると、システムはラベルへのクロススレッドアクセスも許可します
検証が不安定になる例を挙げてください:
Form1.CheckForIllegalCrossThreadCalls = falseを追加しても、ボタンのクリックイベントの下で自分で作成したスレッドを2回呼び出すと、問題が発生し、システムはクロススレッドアクセスが許可されていないことを通知しませんが、ラベル値が表示されると、次のエラーが表示されます。
つまり、スレッド間エラーはCheckForIllegalCrossThreadCallsの値によって無視されますが、今回は例外が検出されます。
要約すると、スレッド間アクセスを許可するための過度の使用は推奨されません。次の追加コードinvokeメソッドはこの問題を解決します。次のブログ投稿を参照してください
// 通过CheckForIllegalCrossThreadCalls的值忽略跨线程错误,这时会抛出异常
private void button1_Click(object sender, EventArgs e)
{
Form1.CheckForIllegalCrossThreadCalls = false;//允许跨线程访问
//第一次调用
btn1 = new Thread(new ThreadStart(doThread));
btn1.IsBackground = true;
btn1.Start();
Thread.Sleep(50);
//第二次调用
// btn1 = new Thread(new ThreadStart(doThread));
// btn1.IsBackground = true;
// btn1.Start();
}
// 不使用invoke方法直接进入Control
void doThread()
{
for (int i = 0; i < 100; i++)
{
test();
Thread.Sleep(10);
}
}
// 模拟一个实际应用
// 对label1赋值后立马检查他的值,如果已经被改过则抛出异常
void test()
{
try
{
string strText = Guid.NewGuid().ToString();//随机生成一串字符
this.label1.Text = strText;//改变label.Text的值
if (this.label1.Text != strText)
{
MessageBox.Show("label1的值意外改变", "错误提示");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "跨线程访问错误提示");
}
}