gpt4 book ai didi

c# - 从另一个线程在窗体上添加控件

转载 作者:太空狗 更新时间:2023-10-29 21:37:01 24 4
gpt4 key购买 nike

我试图推迟向我的主窗体添加控件,目的是加快它的启动时间。好吧,我在以下异常中运行:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com