C# 线程的挂起与恢复
发布时间:2020-12-15 17:53:21 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 private void Form1_Load(object sender,EventArgs e) { Thread fd_thr = new Thread(this.FileDownload); fd_thr.Start(); fd_thr.Suspend(); // 挂
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 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()两个函数的 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |