使用AutoResetEvent的问题

伊水残梦1 2018-11-30 11:22:54
用AutoResetEvent出现两个线程同步的时候,线程1调用了auto.WaitOne(5000),之后开始阻塞,收到线程2的set()信号后变为非阻塞状态。

现在我做的一个软件实时性比较高,在线程2中收到某个信号后需要将线程1的阻塞时间加长2秒,请问这个怎么做?总结起来就是在一个线程通过条用WaitOne处于阻塞状态后,我需要在另一个线程中延长阻塞的时间,请问怎么实现?
...全文
211 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
平底锅锅锅 2018-12-19
  • 打赏
  • 举报
回复
ManualResetEvent
平底锅锅锅 2018-12-19
  • 打赏
  • 举报
回复
在线程2中,再加个AutoResetEvent
sp1234_maJia 2018-11-30
  • 打赏
  • 举报
回复
你的“线程1”至少其实区分两个任务,前半截任务和后半截任务。不管执行半截任务的线程是不是跟前半截的线程是同一个线程,后半截任务其实是另外一个事件驱动的。
var x = 我收集的企业资料;
manager.有消息请通知我 += (s,e) =>
{
    我准备为这个企业服务(x);
}
这是一个很基本的事件驱动设计开发的知识。我们编程中有大量的事件驱动设计,比如你用的大量地 UI 控件在回调用户扩展代码时就依赖事件驱动设计知识。我们设计一个流程时,不要只会“一根筋”地函数式思维,要学会把任务分解为异步。
  • 打赏
  • 举报
回复
举个例子,你去应聘,那么人家告诉你说“后天下午5点会给你打电话通知”,那么你是把人家大门堵死了在那里死等吗?还是先回家,等人家给你打电话?! 程序中其实会有成千上万随时需要异步设计的基本流程。编程设计是定时的、异步的。没有基本的异步知识,而满脑子只有“死循环+阻塞”的做法,滥用机器资源,最终会坑了产品。
  • 打赏
  • 举报
回复
没一个线程都需要至少数 M 栈和堆空间,而且需要大量管理时间。最主要地是它可能诱导某些人动不动就胡乱阻塞。一个滥用线程的东西必须用另一个线程,现在第二个也发现用滥了,需要第二个线程了。 实际上一个进程中有几十万对象、有几十万需要并发处理状态数据的微过程,那种刚学点线程语句就“死循环+阻塞”的滥用线程的方式,很快就把系统卡死了。
  • 打赏
  • 举报
回复
从你的”线程1“就应该采用异步设计思路,你的”线程2”也就不纠结这些。
angel6709 2018-11-30
  • 打赏
  • 举报
回复
Sleep 2000
  • 打赏
  • 举报
回复
可能有的人狡辩说”Task在底层还不是仍然是使用线程?“这类话。 实际上我们一眼就能看出来的是,线程本身没有什么原罪,最恶劣的编程风气是动不动就用”死循环+阻塞“的思路来滥用线程,这就是基本概念的差异。
  • 打赏
  • 举报
回复
一个异步的操作是这样写的
Task.Run(async () =>
{
    await Task.Delay(2000);
    Console.WriteLine("延迟了两秒钟啦!");
});
但是这根本不纠结什么线程(2或者3)的问题,就是随时可以注册一个异步操作,而这个异步操作又是利用了 Task.Delay 方法来注册另外一个异步操作(console.writeline操作)。 现在比较新的理论中,这里不纠结线程,而是异步操作。进程中可以有数万、数十万异步操作,跟线程就根本不是同一个概念。使用 Task 技术可以淘汰那些满脑子只有简单的线程概念的人!
  • 打赏
  • 举报
回复
有没有执行 Set 语句,你的线程2难道自己不知吗?既然你的线程2 是个死循环阻塞的东西,难道它继续阻塞和死循环不就行了么?如果它不想循环,你就弄个”线程3“去死循环+阻塞2秒钟呗。 总的来说,这类程序设计是(定时器)事件驱动的。如果非要滥用线程,只能这样。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧