线程挂起恢复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秒显示为标签上的文本,和暂停,当按下暂停这个计数渐进,然后播放将给予,但不使用计时器…
希望这不是太多的要求,有了这个例子,我可以调整它到我想要的。
感谢您的宝贵时间!你永远不应该使用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线程通过激活/取消激活事件来控制这个:当你点击按钮时,事件状态被切换。