公告
财富商城
积分规则
提问
发文
2020-07-09 09:49发布
Lonely孤独者°
主窗体是一个线程。我一进程序就创建线程A,在线程A里面创建线程B,线程A和B都需要对界面控件进行操作,目前各种报错,请问怎么完美操作线程?
将委托交给UI线程进行处理
在线程的方法里加上参数,参数为你要操作的控件
一般来说后台线程是不允许访问ui线程的 所以,你如果需要对ui线程进行操作,就需要使用委托,这样就不会出现问题了
public Form1() { InitializeComponent(); updateText = new UpdateText(updateTextStart); } public void updateTextStart(string text) { richTextBox1.Text += text + "\r\n"; } public void Form1_Load(object sender, EventArgs e) { Thread A = new Thread(StartA); A.Start(); } public void StartA(object obj) { Thread B = new Thread(StartB); B.Start(); while (true) { Thread.Sleep(1000); Invoke(updateText, "111111111"); } } public void StartB(object obj) { while (true) { Thread.Sleep(1200); Invoke(updateText, "222222"); } } public delegate void UpdateText(string text); public UpdateText updateText; }
完美的话当然是把委托交给ui线程来处理咯。
Control.CheckForIllegalCrossThreadCalls=false;
委托或者事件,或者直接不检查线程安全性 Control.CheckForIllegalCrossThreadCalls=false;
最多设置5个标签!
将委托交给UI线程进行处理
在线程的方法里加上参数,参数为你要操作的控件
一般来说后台线程是不允许访问ui线程的 所以,你如果需要对ui线程进行操作,就需要使用委托,这样就不会出现问题了
public Form1()
{
InitializeComponent();
updateText = new UpdateText(updateTextStart);
}
public void updateTextStart(string text)
{
richTextBox1.Text += text + "\r\n";
}
public void Form1_Load(object sender, EventArgs e)
{
Thread A = new Thread(StartA);
A.Start();
}
public void StartA(object obj)
{
Thread B = new Thread(StartB);
B.Start();
while (true)
{
Thread.Sleep(1000);
Invoke(updateText, "111111111");
}
}
public void StartB(object obj)
{
while (true)
{
Thread.Sleep(1200);
Invoke(updateText, "222222");
}
}
public delegate void UpdateText(string text);
public UpdateText updateText;
}
完美的话当然是把委托交给ui线程来处理咯。
Control.CheckForIllegalCrossThreadCalls=false;
委托或者事件,或者直接不检查线程安全性 Control.CheckForIllegalCrossThreadCalls=false;