C# 线程的挂起与恢复

我本质是不希望有人去挂起或恢复线程的,因为没人知道线程到底执行到了那里,

挂起线程后再恢复线程可能会造成某些问题,然后你容易无法解决它,所以微软

如今是把Thread.Resume()与Thread.Suspend()过时,不久以后会移除出.NET库

但是移除你就无法挂起或恢复了吗?我想是不可能 毕竟办法如此之多 好了我们回

到正题 如果你有必要这样做我也希望你们用AutoResetEvent(自动重置单事件对象)

的配合,因为它会很安全 但是能否够安全还需要具体看开发者自己的代码如何写的。

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread fd_thr = new Thread(this.FileDownload);
            fd_thr.Start();
            fd_thr.Suspend(); // 挂起线程, 过时
            fd_thr.Resume();  // 恢复线程, 过时
        }

        private void FileDownload()
        {
            byte[] buffer = null;
            using (WebClient client = new WebClient())
                buffer = client.DownloadData("http://www.baidu.com");
            Console.WriteLine(Encoding.UTF8.GetString(buffer));
        }

下面的代码,貌似没有问题,但你可能会在输出面板会出现一句错误“引发的异常:

“System.IO.IOException”(位于 mscorlib.dll 中)”那么这就会涉及到一个问题,我本

人是讨厌代码抛出错误的,首先你要知道一但抛出错误意味着无法释放资源且不

说最重要抛出错误的频率过高你的程序意味着稳定性极差不一会可能就会自己挂

掉,每次抛出错误意味着一次堆栈溢出,try catch尽量少用,为什么需要自己体会

        private AutoResetEvent fd_thr_supend = new AutoResetEvent(false);

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread fd_thr = new Thread(this.FileDownload);
            fd_thr.Start();
            this.fd_thr_supend.Reset(); // 挂起线程
            this.fd_thr_supend.Set(); // 恢复线程
        }

        private void FileDownload()
        {
            byte[] buffer = null;
            using (WebClient client = new WebClient())
                buffer = client.DownloadData("http://www.baidu.com");
            this.fd_thr_supend.WaitOne(); // 阻塞,等待信号
            Console.WriteLine(Encoding.UTF8.GetString(buffer));
        }

上面则配合AutoResetEvent方式配合进行线程的挂起或恢复,这样做有利代码的

安全与减少发生错误的几率,因为你不是真正的把线程挂起而是阻塞线程 那么一

旦发生错误 你可以尽早的排查错误,而不是因为Thread.Resume()与Thread.Sus

pend()方式一挂起,一旦发生错误你根本找不到错误的原因,大大的增加了稳定

性与安全性。

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int GetCurrentThreadId();

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int SuspendThread(IntPtr hThread);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern uint ResumeThread(IntPtr hThread);

        public int hCurrenthThreadId;

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr OpenThread(int dwDesiredAccess, bool bInheritHandle, uint dwThreadId);

        public const int THREADACCESS_SUSPEND_RESUME = 0x0002;

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread fd_thr = new Thread(this.FileDownload);
            fd_thr.Start();
            while (this.hCurrenthThreadId == 0); // 等待线程被启动
            IntPtr hCurrenthThread = OpenThread(THREADACCESS_SUSPEND_RESUME, false, (uint)this.hCurrenthThreadId);
            // 挂起线程
            SuspendThread(hCurrenthThread);
            // 恢复线程
            ResumeThread(hCurrenthThread);
        }

        private void FileDownload()
        {
            this.hCurrenthThreadId = GetCurrentThreadId();
            byte[] buffer = null;
            using (WebClient client = new WebClient())
                buffer = client.DownloadData("http://www.baidu.com");
            Console.WriteLine(Encoding.UTF8.GetString(buffer));
        }

上面的方法也不安全,因为上面的做法其实与Thread.Resume()与Thread.Suspend()两个函数的

功能差不多,不过是用于代替过时命令的一种Winapi方案,当然还有一些办法。总之挂起或恢复

一个线程的办法并不少 上面的三种方法其实都可以 不过需要考虑稳定性才是真。

时间: 2024-11-10 19:15:26

C# 线程的挂起与恢复的相关文章

七. 多线程编程11.线程的挂起、恢复和终止

有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线程机制在Java 2和早期版本中有所不同.尽管你运用Java 2的途径编写代码,你仍需了解这些操作在早期Java环境下是如何完成的.例如,你也许需要更新或维护老的代码.你也需要了解为什么Java 2会有这样的变化.因为这些原因,下面内容描述了执行线程控制的原始方法,接着是Java 2的方法. Jav

Java知多少(65)线程的挂起、恢复和终止

有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线程机制在Java 2和早期版本中有所不同.尽管你运用Java 2的途径编写代码,你仍需了解这些操作在早期Java环境下是如何完成的.例如,你也许需要更新或维护老的代码.你也需要了解为什么Java 2会有这样的变化.因为这些原因,下面内容描述了执行线程控制的原始方法,接着是Java 2的方法. Jav

JAVA多线程之线程的挂起与恢复(suspend方法与resume方法)

一,介绍 本文讨论JAVA多线程中,使用 thread.suspend()方法暂停线程,使用 thread.resume()恢复暂停的线程 的特点. 先介绍二个关于线程的基本知识: ①线程的执行体是run()方法里面的代码. ②Thread.sleep()方法 使当前正在执行的线程睡眠. 二,suspend()方法 ①当某个线程的suspend()方法被调用时,该线程会被挂起.如果该线程占有了锁,则它不会释放锁.即,线程在挂起的状态下还持有锁. ②suspend()已经是一个过时的方法了. 来分

Linux中线程的挂起与恢复(进程暂停)

http://www.linuxidc.com/Linux/2013-09/90156.htm 今天在网上查了一下Linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制.也没有完整详细的代码.故自己整理了一下 程序流程为:主线程创建子线程(当前子线程状态为stop停止状态),5秒后主线程唤醒子线程,10秒后主线程挂起子线程,15秒后主线程再次唤醒子线程,20秒后主线程执行完毕等待子线程退出. 代码如下:#include#include#include#include#incl

线程的挂起和恢复 转载

(1)概述:线程的挂起操作实质上就是使线程进入"非可执行"状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行.在线程挂起后,可以通过重新唤醒线程来使之恢复运行. run() 和start() 是大家都很熟悉的两个方法.把希望并行处理的代码都放在run() 中:stat() 用于自动调用run(),这是Java的内在机制规定的.当一个线程进入"非可执行"状态,必然存在某种原因使其不能继续运行,这些原因可能是如下几种情况:     A,

转: 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件--其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁.另外,在长时间计算期间挂起线程也可能导致问题. 下面的代码演示了通过休眠来延缓运行

【Java并发编程】:线程挂起、恢复与终止

挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件--其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁.另外,在长时间计算期间挂起线程也可能导致问题. 下面的代码演示了通过休眠来延缓运行,模拟长时间运行的情况,使线程更可能在不适当的时候被挂起: public class DeprecatedSuspendRe

Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)

JAVA大数据中高级架构 2018-11-06 14:24:56挂起和恢复线程Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件--其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁.另外,在长时间计算期间挂起线程也可能导致问题. 下面的代码演示了通过休眠来延缓运行,模拟长时间运行的情况,使线程更可能在不适当的时候被挂起: publi

例8.13 本例用于演示挂起和恢复!

// 本例用于演示挂起和恢复!class E13{ public static void main(String args[]) { A a=new A(); Thread thread=new Thread(a); thread.setName("zhang san"); thread.start(); while(a.getStop()==false){} System.out.println("我是主线程,负责恢复"+thread.getName()+&quo