【问题标题】:Threads suspend resume c#线程暂停恢复c#
【发布时间】:2013-06-16 21:51:19
【问题描述】:

对不起,我的英语;我有线程问题: 我有一个 WinForm,里面有两个按钮(播放和暂停) 我希望当你按下 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,以及启动标签时的两个按钮(播放和暂停)怎么办写为 0,如果点击 Play,它会启动一个线程,该线程调用一个函数,该函数具有从 1-1000 变化的函数,睡眠时间为 1 秒,以在标签上显示为文本,并暂停,按下时将暂停此计数渐进式,那么这出戏就会给出,但不使用计时器......

希望不要问太多,通过这个例子,我可以将其调整为我想要的。

感谢您的宝贵时间!

【问题讨论】:

  • .NET 中也可以使用相同的方法(Suspend、Resume),哪些不起作用?
  • 这些方法已弃用且危险,您能举个例子吗?请
  • 我会先发布一个 .Net 代码,显示 “我做了这个”,然后问 “我怎样才能用非弃用的方法替换它” ..
  • 谢谢,感谢postearas这些代码,需要提前

标签: c# multithreading winforms thread-safety


【解决方案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 线程通过激活/停用事件来控制这一点:当您单击按钮时,事件状态会切换。

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 2011-08-08
    • 2015-02-21
    • 2012-07-13
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多