Почему форма застывает? - PullRequest
       1

Почему форма застывает?

0 голосов
/ 18 сентября 2011

Эта программа записывает числа от 1 до 5000 в потоке, но основная форма все равно зависает. Где ошибка? Заранее спасибо.

Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int how, current;
        bool job;
        Object lockobj = new Object();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Started!");
            how = 5000;
            current = 0;
            job = true;
            Thread worker = new Thread(Go);
            worker.Name = "1";
            worker.Start();
        }

        private void Go()
        {
            while (job)
            {
                if (current < how)
                {

                    lock (lockobj)
                    {
                        current++;
                    }

                    log(string.Format("Thread #{0}: {1}", Thread.CurrentThread.Name, current));
                }
                else
                {
                    job = false;
                }
            }
        }


        private void log(string text)
        {
            Action A = new Action(() =>
            {
                richTextBox1.AppendText(text + System.Environment.NewLine);
            });

            if (richTextBox1.InvokeRequired)
                this.BeginInvoke(A);
            else A();
        }
    }


}

Ответы [ 2 ]

3 голосов
/ 18 сентября 2011

Поскольку большая часть вашей работы будет потрачена на

        if (richTextBox1.InvokeRequired)
            this.BeginInvoke(A);

, и пока вы вызываете форму, она заблокирована.

Сделайте некоторую реальную работу, например Thread.Sleep(1000); :-),вместо current++; и ваша форма будет ответом между обновлениями.

3 голосов
/ 18 сентября 2011

Он зависает, потому что вы рендерите текстовое поле очень быстро, а графический интерфейс не успевает синхронизироваться. Помните, что это рендеринг происходит в главном потоке графического интерфейса и при вызове BeginInvoke для обновления текстового поля так быстро фактически потребляет все ресурсы этого основного потока графического интерфейса. Попробуйте снизить частоту, с которой вы регистрируете , чтобы избежать этого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...