线程挂起恢复c#

本文关键字:恢复 挂起 线程 | 更新日期: 2023-09-27 18:18:42

不好意思;我有一个线程的问题:我有一个WinForm,里面有两个按钮(Play &停顿)我希望,当你按下播放按钮,如果它是创建线程,思考和开始,和暂停按钮暂停线程。然后,如果线程暂停,按下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与一个标签,两个按钮(播放和;暂停)当开始标签写0时,如果点击播放,它会启动一个线程,调用一个函数,该函数的值从1-1000变化,睡眠1秒显示为标签上的文本,和暂停,当按下暂停这个计数渐进,然后播放将给予,但不使用计时器…

希望这不是太多的要求,有了这个例子,我可以调整它到我想要的。

感谢您的宝贵时间!

线程挂起恢复c#

你永远不应该使用suspend/resume,无论是在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线程通过激活/取消激活事件来控制这个:当你点击按钮时,事件状态被切换。