加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读