Открытие новой формы вызывает ее зависание (не отвечает) при выполнении цикла / таймера - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть какой-то проект, где в одном случае, когда какая-то форма открывается, она просто зависает (не отвечает) и закрывается через короткое время. Я работаю над этой проблемой 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")));
        }

    }
}

1 Ответ

0 голосов

Это распространенная проблема. Вы пытаетесь получить доступ к тому, что не принадлежит вашей теме. Используйте BeginInvoke:

private void PerformMacro()
{
    //Dont forget to exit the loop somehow!
    while (flag)
    {
        Thread.Sleep(5000);
        BeginInvoke( new MethodInvoker( Program.openform2 ) );
        //flag = false;
    }

}
...