架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

[.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382
[.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382
[.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382
[.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382
[.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382
[.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382
[.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382 [.Net/C#]2000人开发交流Qq群:348041382
查看: 162|回复: 1

[资料] .net/c# Thread线程Suspend和Resume过时解决方案

[复制链接]
发表于 2018-5-17 09:36:10 | 显示全部楼层 |阅读模式
Thread.Suspend has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202
Thread.Resume has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202
  1. static Thread th = new Thread(() => threadTest()) { IsBackground = true };
  2. th.Start();
  3. th.Resume();
  4. th.Suspend();
复制代码
线程想暂停或则继续,以前用过Suspend和Resume两个方法,用这两个方法去操作线程,其实是有问题的,当时也没管,今天就拿出来研究下吧!

用上面两个方法去挂起和继续线程会有什么问题呢?

如果,这两个方法操作太快会抛异常的,例如:我们调用Suspend方法挂起线程,然后,立马调用Resume方法继续挂起的线程,这时就有可能会出问题。

因为,你在调用Suspend方法挂起线程后,线程并不一定立马会被挂起,这里需要处理时间,这时,你立马调用Resume方法继续挂起的线程,程序就立马挂掉了!

微软给的解释为:


请不要使用 Suspend 和 Resume 方法来同步线程活动。 有没有办法知道当你暂停执行线程什么代码。 如果在安全权限评估期间持有锁,您挂起线程中的其他线程 AppDomain 可能被阻止。 如果执行类构造函数时,您挂起线程中的其他线程 AppDomain 中尝试使用类被阻止。 可以很容易发生死锁。

//
        // 摘要:
        //     继续已挂起的线程。
        //
        // 异常:
        //   T:System.Threading.ThreadStateException:
        //     该线程尚未启动、 已死或未处于挂起状态。
        //
        //   T:System.Security.SecurityException:
        //     调用方没有适当的 System.Security.Permissions.SecurityPermission。
        [Obsolete("Thread.Resume has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202", false)]
        [SecuritySafeCritical]
        public void Resume();

怎么解决这个问题呢?

QQ截图20180517092217.jpg

ManualResetEvent 类

通知一个或多个正在等待的线程已发生事件。 此类不能被继承。


  1. //
  2.         // 摘要:
  3.         //     新实例初始化 System.Threading.ManualResetEvent 使用 Boolean 值,该值指示是否将初始状态设置为终止状态的类。
  4.         //
  5.         // 参数:
  6.         //   initialState:
  7.         //     true 若要设置的初始状态信号; false 初始状态设置为终止状态。
  8.         public ManualResetEvent(bool initialState);
复制代码
测试代码如下:

  1. static Thread th = new Thread(() => threadTest()) { IsBackground = true };
  2.         static ManualResetEvent _event = new ManualResetEvent(false);
  3.         static void Main(string[] args)
  4.         {
  5.             th.Start();
  6.             Thread.Sleep(2000);
  7.             _event.Reset();
  8.             Thread.Sleep(2000);
  9.             _event.Set();
  10.             Thread.Sleep(2000);
  11.             for (int i = 0; i < 100; i++)
  12.             {
  13.                 if (i % 2 == 0)
  14.                     _event.Set();
  15.                 else
  16.                     _event.Reset();
  17.             }
  18.             Console.ReadKey();
  19.         }

  20.         static void threadTest()
  21.         {
  22.             while (true)
  23.             {
  24.                 _event.WaitOne();
  25.                 Console.WriteLine("http://www.itsvse.com_" + DateTime.Now.ToLongTimeString());
  26.                 Thread.Sleep(100);
  27.             }
  28.         }
复制代码






上一篇:C#发送短信到手机
下一篇:sql去除数据中的空格
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2018-5-17 21:14:51 | 显示全部楼层
_event.Set(); 是继续线程
_event.Reset(); 是暂停线程
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2018-5-28 07:40

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表