如何暂停/恢复一个帖子

Yus*_*tme 13 c# wpf resume multithreading

如何暂停/恢复线程?一旦我Join()成为一个线程,我就无法重启它.那么,当按下按钮"暂停"时,如何启动一个线程并使其暂停,并在按下恢复按钮时恢复它?

这个线程唯一能做的就是在标签控件中显示一些随机文本.

Joh*_*ger 21

也许这ManualResetEvent是一个不错的选择.一个简短的例子:

private static EventWaitHandle waitHandle = new ManualResetEvent(initialState: true); 

// Main thread
public void OnPauseClick(...) {
   waitHandle.Reset();
}

public void OnResumeClick(...) {
   waitHandle.Set();
}

// Worker thread
public void DoSth() {
   while (true) {
     // show some random text in a label control (btw. you have to
     // dispatch the action onto the main thread)
     waitHandle.WaitOne(); // waits for the signal to be set
   }
}
Run Code Online (Sandbox Code Playgroud)


gli*_*ite 6

我可以建议你阅读Joe Albahari的C#中的线程,特别是Suspend and Resume部分:

可以通过弃用的方法Thread.Suspend和Thread.Resume显式挂起和恢复线程.这种机制与阻塞机制完全分开.两个系统都是独立的并且并行运行.

线程可以挂起自己或其他线程.调用Suspend导致线程暂时进入SuspendRequested状态,然后在达到垃圾收集安全点时,它进入Suspended状态.从那里,它只能通过另一个调用其Resume方法的线程来恢复.Resume只能在挂起的线程上工作,而不是阻塞的线程.

从.NET 2.0开始,Suspend和Resume已被弃用,由于任意暂停另一个线程所固有的危险,因此不鼓励使用它们.如果暂停对关键资源进行锁定的线程,则整个应用程序(或计算机)可能会死锁.这比调用Abort更危险 - 这导致任何这样的锁通过finally块中的代码被释放(至少在理论上).

SuspendRequested状态