AutoResetEvent表现异常时如何检测?

dfererer 2011-02-27 11:57:53
//变量声明:
AutoResetEvent breakplayctrlevent=new AutoResetEvent(false);

//在另一个线程的循环中检测:
while(true){
if(breakplayctrlevent.WaitOne(0,false)){
break;
}
//...
}

//主线程控制:
breakplayctrlevent.Set();


看上去并无甚复杂,但并非总能正常运行,偶尔会出现失控的时候。请问有什么方法能只检测breakplayctrlevent的状态但不改变它么?

可能会有人说,为什么不就直接用一个普通bool变量进行控制与检测呢?也可以吧,这里只是想利用一下AutoResetEvent的自动恢复功能吧。
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyq11 2011-02-27
  • 打赏
  • 举报
回复
主线程
var lock1 = new ManualResetEvent(false);
lock1执行Set;

lock1.WaitOne();

((AutoResetEvent)e.UserState).Set();//停止线程的阻塞状态
dfererer 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]
if(breakplayctrlevent.WaitOne(0,false)){
break;
}

这叫啥代码?是什么意思?没有看懂。

WaitOne返回的bool值跟你所要的是一个概念吗?
[/Quote]
WaitHandle.WaitOne(Int32, Boolean):等待Int32时间后强制继续,Int32=0自然是立即退出等待,返回值表示是否有信号状态,这样恰好实现了非阻塞信号检测与复位(需要的话),刚好是我需要的"概念",此等伎俩我用很久了。
dfererer 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]
if(breakplayctrlevent.WaitOne(0,false))
{
break;
}

这叫啥代码?是什么意思?没有看懂。

WaitOne返回的bool值跟你所要的是一个概念吗?
[/Quote]

WaitHandle.WaitOne(Int32, Boolean):等待Int32时间后强制继续,Int32=0自然是立即退出等待,返回值表示是否有信号状态。

dfererer 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qldsrx 的回复:]
引用楼主 dfererer 的回复:
看上去并无甚复杂,但并非总能正常运行,偶尔会出现失控的时候。请问有什么方法能只检测breakplayctrlevent的状态但不改变它么?

可能会有人说,为什么不就直接用一个普通bool变量进行控制与检测呢?也可以吧,这里只是想利用一下AutoResetEvent的自动恢复功能吧。
你这两句话自相矛盾了。既然想要只检测但不改变它,又为何要用它自动恢复……
[/Quote]

我想在检查一下到底问题出在哪里,正常运行环境下自然不会再去检测它了。
qldsrx 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 dfererer 的回复:]
看上去并无甚复杂,但并非总能正常运行,偶尔会出现失控的时候。请问有什么方法能只检测breakplayctrlevent的状态但不改变它么?

可能会有人说,为什么不就直接用一个普通bool变量进行控制与检测呢?也可以吧,这里只是想利用一下AutoResetEvent的自动恢复功能吧。[/Quote]
你这两句话自相矛盾了。既然想要只检测但不改变它,又为何要用它自动恢复功能呢?自动恢复了,就意味着改变它了。
  • 打赏
  • 举报
回复
[Quote=引用楼主 dfererer 的回复:]
if(breakplayctrlevent.WaitOne(0,false))
{
break;
}
[/Quote]
这叫啥代码?是什么意思?没有看懂。

WaitOne返回的bool值跟你所要的是一个概念吗?

110,534

社区成员

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

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

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