WaitHandle 中 set() reSet() waione关系

 private static ManualResetEvent mre = new ManualResetEvent(false);

main(){

  Thread t = new Thread(ThreadProc);
                t.Name = "Thread_1" ;
                t.Start();

}

ManualResetEvent   对象控制的是mre 这个对象 调用了set()  reSet()   waitone的线程。如果还有一个mre2这个不会相互干扰。

当子线程   Thread_1  调用  waione()   那么这个线程将会暂停    直到 mre对象在其他线程中被调用Set()。的时候后才会继续。

set()方法的意思是好了我给mre一个信号  所有被mre这只为waione阻塞暂停的  线程   重新开始运行。


reSet() 的意思是  调用了set()的mre已经把信号置为了可运行了,所以子线程调用waitone的时候会发现  已经被set信号了,所以会继续运行,但是调用了reSet()后,这个信号再次被初始化,也就是  子线程调用waitone的时候会再次需要等等mre的信号。

在 C# ,如果你想要结束一个正在阻塞(例如通过 `Thread.Sleep` 或 `WaitHandle.WaitOne` 等)的线程,你可以使用以下几个方法: 1. **断(Interrupt)**: 对于一些支持断的阻塞操作(如 `Thread.Join` 和 `ManualResetEventSlim.Wait`),你可以调用 `.Abort()` 或 `.interrupt()` 方法尝试断线程。但这通常会抛出异常,而且不是所有同步操作都支持断。 ```csharp if (thread.ThreadState == ThreadState.Running) { thread.Interrupt(); // 如果你想捕获可能会发生的异常 try { thread.Join(Timeout.Infinite); } catch (ThreadInterruptedException ex) { Console.WriteLine("Thread interrupted."); } } ``` 2. **取消等待(Cancel Wait)**: 使用 `CancellationTokenSource` 可以优雅地取消等待。创建一个 `CancellationToken`,然后在需要的地方设置它,比如在 `Task.Delay` 或 `SemaphoreSlim.WaitAsync` 。 ```csharp CancellationTokenSource cts = new CancellationTokenSource(); var token = cts.Token; // 后续的异步等待使用token await Task.Delay(TimeSpan.FromSeconds(5), token); // 如果需要提前取消,调用cts.Cancel() cts.Cancel(); ``` 3. **使用 `Task` 或 `async`/`await` 结构**: 当你在 `async` 函数使用 `await` 关键字时,可以将 `CancellationToken` 作为参数传递给可等待的操作,如果信号到来,则任务会被取消并返回。 ```csharp async Task MyFunction(CancellationToken cancellationToken) { await SemaphoreSlim.WaitAsync(semaphore, cancellationToken); // ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值