C# 线程的挂起与恢复

C# 线程的挂起与恢复,第1张

概述C# 线程的挂起与恢复

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

        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));        }
下面的代码,貌似没有问题,但你可能会在输出面板会出现一句错误“引发的异常:
        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方式配合进行线程的挂起或恢复,这样做有利代码的
        [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()两个函数的

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的C# 线程的挂起与恢复全部内容,希望文章能够帮你解决C# 线程的挂起与恢复所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237809.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存