循环刷新应用程序窗口

时间:2011-12-08 11:49:08

标签: c# window

我有一个Windows窗体应用程序,其中有一个Button。如果单击它,则会启动一个包含大量工作的大循环,这可能需要一些时间(最多几分钟)。在那段时间里,窗户对任何事情都没有反应,你甚至无法移动它。什么方式去这里?我可以拨打一个窗口更新功能吗?我是否必须在新线程中运行循环?

2 个答案:

答案 0 :(得分:3)

  

我是否必须在新线程中运行循环?

是的,您可以使用BackgroundWorker类进行长时间操作,并通过form.Invoke从其他线程更新应用程序的界面。

C# Winform ProgressBar and BackgroundWorker

Best Practice for BackGroundWorker in WinForms using an MVP architecture

答案 1 :(得分:2)

使用多线程 - 这是我前面写的一个例子。你基本上在另一个线程上进行所有处理,因此它不会占用GUI线程。

http://wraithnath.blogspot.com/2010/09/simple-multi-threading-example.html

单击按钮时启动一个新线程(如果您将处理线程声明为成员,则可以将其停止等,如果要取消该过程,还可以在处理循环中检查一个IsProcessing成员变量) )

            //Create a new Thread start object passing the method to be started
            ThreadStart oThreadStart = new ThreadStart(this.DoWork);

            //Create a new threat passing the start details
            Thread oThread = new Thread(oThreadStart);

            //Optionally give the Thread a name
            oThread.Name = "Processing Thread";

            //Start the thread
            oThread.Start();

有一个处理方法

        /// <summary>
        /// Simulate doing work
        /// </summary>
        private void DoWork()
        {
            try
            {
                for (int i = 0; i < m_RecordCount; i++)
                {
                    //Sleep for 100 miliseconds to simulate work
                    Thread.Sleep(100);

                    //increment the progress bar by invoking it on the main window thread
                    progressBar.Invoke(
                        (MethodInvoker)
                        delegate
                        {
                            //Increment the progress bar
                            progressBar.Increment(1);
                        }
                    );
                }

                //Join the thread
                Thread.CurrentThread.Join(0);
            }
            catch (Exception)
            {
                throw;
            }
        }