Em C #, é proibido o acesso direto de thread cruzado ao controle.InvokeRequired é criado para resolver esse problema.Quando o valor da propriedade InvokeRequired de um controle é verdadeiro, significa que um thread diferente daquele que o criou deseja acessá-lo.
Obtém um valor indicando se o chamador deve chamar o método Invoke ao fazer uma chamada de método para o controle porque o chamador está em um thread que não seja o segmento em que o controle foi criado.
Se você chamar o método de controle de outro encadeamento, deverá usar um método Invoke do controle para empacotar a chamada no encadeamento apropriado
Quando se clica em "button2", o valor do rótulo é alterado por outro encadeamento btn2, mas o encadeamento btn2 é executado pelo método invoke. No momento, nenhum erro será relatado, mesmo que o encadeamento seja chamado várias vezes no evento click do button2, ele não será Há um erro: quando o botão é clicado, o sistema sabe que é chamado entre threads e o método de chamada (delegação) é usado para executar o método, e o problema será resolvido sem erros;
consulte a postagem do blog:
https://blog.csdn.net/qq_39217004/article/details / 105439971
if (this.InvokeRequired)
{
this.Invoke(new dTest(test));
}
public Form1()
{
InitializeComponent();
}
private Thread btn1;
private Thread btn2;
// 模拟一个实际应用
// 对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, "跨线程访问错误提示");
}
}
// 使用invoke方法
public delegate void dTest();
void invokeThread()
{
for (int i = 0; i < 102; i++)
{
if (this.InvokeRequired)
{
this.Invoke(new dTest(test));
}
else
{
test();
}
Thread.Sleep(10);
}
}
// 通过invoke方法,在主线程排队,lable1的值在test函数体内永远是线程安全的.
private void button2_Click(object sender, EventArgs e)
{
btn2 = new Thread(new ThreadStart(invokeThread));
btn2.Name = "通过invoke方法";
btn2.Start();
btn2 = new Thread(new ThreadStart(invokeThread));
btn2.Name = "通过invoke方法";
btn2.Start();
}