У меня есть какой-то проект, где в одном случае, когда какая-то форма открывается, она просто зависает (не отвечает) и закрывается через короткое время. Я работаю над этой проблемой 2 дня и не могу найти решение. Поэтому теперь я решил сделать новый проект (простой) и протестировать только эти открывающие формы, и обнаружил, что это происходит только тогда, когда я вызываю функцию, чтобы открыть форму из некоторого цикла или таймера.
Вот ссылка на zip-файл этого простого небольшого проекта
В примере проекта я создал простое приложение, которое открывает новую форму каждые 5 секунд, и все эти формы не реагируют, а если вы нажмете кнопку, которая использует ту же функцию, она откроется нормально.
Если кто-то может просто объяснить, как это исправить (мне нужно держать цикл), чтобы эти формы больше не зависали, это было бы здорово, я полностью потерян ...
Вот код, если кто-нибудь увидит проблему только из кода:
ФОРМА 1
using System;
using System.Threading;
using System.Windows.Forms;
namespace TestForm
{
public partial class Form1 : Form
{
bool flag = true;
private Thread worker;
public Form1()
{
InitializeComponent();
this.worker = new Thread(new ThreadStart(this.PerformMacro));
this.worker.IsBackground = true;
this.worker.Start();
}
private void button1_Click(object sender, EventArgs e)
{
Program.newForm2Window();
}
private void PerformMacro()
{
while (flag)
{
Thread.Sleep(5000);
Program.openform2();
//flag = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
Program.openform2();
}
}
}
ФОРМА 2
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TestForm
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
this.Text = "Form2 - " + Program.form2List.Count;
}
public delegate void Action();
public void MakeNMac(string text)
{
label1.Text = "Label changed...";
}
}
}
ПРОГРАММА:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TestForm
{
static class Program
{
public static List<Form2> form2List = new List<Form2>();
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
public static Form2 newForm2Window()
{
Form2 item = new Form2();
form2List.Add(item);
item.Show();
return item;
}
public static void openform2()
{
newForm2Window();
Form2 miew = Program.form2List[Program.form2List.Count - 1];
miew.BeginInvoke((Form2.Action)(() => miew.MakeNMac("test")));
}
}
}