线程暂停恢复c#

时间:2013-06-16 21:51:19

标签: c# multithreading winforms thread-safety

原谅我的英语;线程有问题: 我有一个WinForm,里面有两个按钮(Play& Pause) 我希望当你按下PLAY按钮时,如果它创建了线程,思考并启动,并且PAUSE按钮暂停线程。 然后,如果线程暂停,按PLAY按钮将从其停止的位置恢复线程。 像电子游戏...... 在Java中,我成功地做了一些事情,

Runnable h = new MiHilo();
Thread t = new Thread(h);
public void PLAYActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PLAYActionPerformed
    if (t.isAlive())
    {
        t.resume();
    }
    else
    {
        h = new MiHilo();
        t = new Thread(h);
        t.start();
    }
}
private void PAUSEActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PAUSEActionPerformed
    if (!t.isAlive())
    {
        JOptionPane.showMessageDialog(null, "         ¿En qué está pensando?\nEs imposible pausar algo que no ha empezado.",
        "David", JOptionPane.ERROR_MESSAGE);
    }
    else
    {
        t.suspend();
    }
}



 class MiHilo implements Runnable
{
        public void run()
        {

                // Code here...

        }

}

我如何在C#中做到这一点? 如果我想要,如果没有太多麻烦告诉我如何做一些基本的事情,暂停和恢复,一些简单的事情,如带有标签的单个WinForm,以及启动时的两个按钮(Play& Pause) label写为0,如果按下Play,它会启动一个调用函数的线程,该函数的变化范围为1-1000,睡眠为1秒,在标签上显示为文本,暂停,按下时会暂停此计数渐进式,然后戏剧会给,但不使用计时器......

希望不要问太多,用这个例子我可以根据自己的需要调整它。

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

你永远不应该使用暂停/恢复,无论是Java还是C#,因为只有你的线程知道什么时候可以安全地停止或暂停。

而是使用同步原语,例如事件来控制线程的执行。

以下是使用 WinForms 的一些示例(因此您只需要添加对 System.Windows.Forms 的引用):

using System.Threading;
using System.Windows.Forms;
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Label label = new Label { Dock = DockStyle.Top };
            Button button = new Button { Text = "||", Dock = DockStyle.Bottom };

            Form form = new Form();
            form.Controls.Add(label);
            form.Controls.Add(button);

            bool @continue = true;

            bool isRunning = true;
            ManualResetEvent run = new ManualResetEvent(true);

            int i = 0;
            form.Load += (s, a) =>
                {
                    ThreadPool.QueueUserWorkItem(o =>
                        {
                            while (@continue)
                            {
                                run.WaitOne();
                                label.Invoke((Action)(() => { label.Text = i++.ToString(); }));
                                Thread.Sleep(1000);
                            }
                        });
                };

            button.Click += (s, a) =>
                {
                    isRunning = !isRunning;
                    if (isRunning)
                        run.Set();
                    else
                        run.Reset();
                    button.Text = isRunning ? "||" : ">>";
                };

            form.Disposed += (s, a) => @continue = false;

            Application.Run(form);
        }
    }
}

因此,计算的线程(请注意,如果您想计算秒数,这根本不准确)每次检查它是否必须继续或等待使用“ WaitOne ”。

UI线程通过激活/停用事件来控制它:当您单击按钮时,切换事件状态。