作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图推迟向我的主窗体添加控件,目的是加快它的启动时间。好吧,我在以下异常中运行:
Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
我试图在一个较小的例子中简单地解决问题,但问题仍然存在。这是我的代码:
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
namespace AddConrolFromAnotherThread {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void AddButton() {
if(this.InvokeRequired){
this.Invoke(new MethodInvoker(this.AddButton));
}
Random random = new Random(2);
Thread.Sleep(20);
Button button = new Button();
button.Size = new Size(50,50);
button.Location =
new Point(random.Next(this.Width),random.Next(this.Height));
this.Controls.Add(button);
}
private void buttonStart_Click(object sender, EventArgs e) {
Thread addControlThread =
new Thread(new ThreadStart(this.AddButton));
addControlThread.Start();
}
}
}
我确实使用了 Invoke 方法并检查了 InvokeRequiered 是否为真,但 InvokeRequiered 一直保持“真”。我真的不明白。至少我会期待 StackOverflow 异常,因为这是一个递归调用。
所以,如果有人遇到类似的问题,请告诉我我做错了什么?
最佳答案
您的代码中的问题是您要添加两个按钮。
将代码放在 else block 中的 if block 之后。
private void AddButton() {
if(this.InvokeRequired){
this.Invoke(new MethodInvoker(this.AddButton));
}
else {
Random random = new Random(2);
Thread.Sleep(20);
Button button = new Button();
button.Size = new Size(50,50);
button.Location = new Point(random.Next(this.Width),random.Next(this.Height));
this.Controls.Add(button);
}
}
关于c# - 从另一个线程在窗体上添加控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250749/
我是一名优秀的程序员,十分优秀!