Я пытался отложить добавление элементов управления в свою основную форму, чтобы ускорить время ее запуска. Ну, я запускаю следующее исключение:
Недопустимая межпоточная операция: доступ к элементу управления «Form1» осуществляется из потока, отличного от потока, в котором он был создан.
Я попытался просто решить проблему на меньшем примере, но проблема остается. Вот мой код:
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, поскольку это рекурсивный вызов.
Итак, если кто сталкивался с подобной проблемой, подскажите, пожалуйста, что я сделал не так?