- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
例子
System.Threading.AutoResetEvent e = new System.Threading.AutoResetEvent(false);
bool b = e.WaitOne(1000, false);
我做过很多多线程开发,一直想知道那个方法有什么用。 WaitOne 上的第二个 bool 参数称为 exitContext。 MS 帮助说明 “如果在等待之前退出上下文的同步域(如果在同步上下文中),并在之后重新获取它,则为 true;否则为 false。”
有人知道这是什么意思吗?这是我应该担心的事情吗?
亲切的问候诺尔
最佳答案
我不能要求信用(因此 wiki),但有一个很好的答案 here .
从链接中回答问题,作者 Sasha Goldshtein
The CLR has support for a notion called contexts. A context is alogical grouping of objects. When a method call is made on an objectthat is inside your context, nothing in particular happens except forthe method itself. When a method call is made on an object that isoutside your context, then "something" might happen before the methoditself is executed. All .NET classes derived from ContextBoundObjectwill be associated with a context at runtime.
An example of that "something" that can happen before the method iscalled would be enforcing synchronization. An object that derivesfrom ContextBoundObject and specifies the [Synchronization] attributewill get automatic synchronization services from the runtime. Thismeans that only one thread will ever be able to execute within theobject's context.
The exitContext parameter of the WaitOne method specifies whether toleave the synchronization context before issuing the wait. Thisenables reentrancy. Here's a scenario where this is necessary:
Code Snippet [Synchronization] public class MyCounter :ContextBoundObject {
private int _expectedCounterVal; private int _currentCounterVal;private ManualResetEvent _event = new ManualResetEvent(false);
public void WaitUntilCounterIs(int counterVal) {
_expectedCounterVal = counterVal; _event.WaitOne(TimeSpan.FromDays(1), true); }public void IncrementCounter() { if (++_currentCounterVal >=_expectedCounterVal) { _event.Set(); } } }
In this case, if the WaitUntilCounterIs method is issued without theexitContext=true parameter of the WaitOne method, then no other threadwill be able to ever call the IncrementCounter method on the object,resulting in a deadlock. However, once exitContext=true is specified,other threads can enter the IncrementCounter method and signal theevent at some point, even though the WaitUntilCounterIs method has notyet returned.
关于c# - 用于 WaitHandle.WaitOne 方法的 exitContext 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/755608/
我一直注意到对 WaitHandle.WaitAny 的调用会分配给它的 WaitHandle[] 的副本。从下面的链接或使用反射器可以看出: http://reflector.webtropy.co
根据文档,.NET 中的 WaitHandle 应该显式/隐式处理。但是,我在实现以下基本同步任务时遇到了麻烦: 一个耗时的任务正在一个线程上执行。 主线程在预定义的时间段内等待任务完成。如果 a.
这可能(以一种有意义的方式)吗? 例如,假设我想实现一个等待队列如下: public class WaitableQueue : WaitHandle { public WaitableQue
我的代码是 public static void Invoke(Action[] Actions) { Thread[] threadArray = new Thread[Actions.Le
我有一个 WaitHandle我想知道如何检查 WaitHandle 是否已经设置。 注意:我可以添加一个 bool 变量,每当使用 Set() 方法时将该变量设置为 true,但此行为必须在 Wai
C# .net 线程中 WaitHandle 背后的基本概念是什么?它的用途是什么?什么时候使用它?它里面的WaitAll和WaitAny方法有什么用? 最佳答案 每当您想要控制应用中多个线程的执行时
是否有可能不使用 WaitHandle.WaitAll(waitHandles) 阻止 winForm,而是设置另一个线程,当从 WaitHandle.WaitAll 获取完成信号时将触发该线程? 最
我正在公开一个 WaitHandle在负责在内部创建资源的对象的接口(interface)上,但这可能需要很长时间。契约(Contract)看起来像这样: public interface IHave
我正在尝试创建一个 Windows 服务,该服务每 5 分钟轮询一次系统并检查需要完成的某些操作。我已经阅读了 WaitHandles 及其在该领域的实用性,但需要了解其工作原理。 见下面的代码: p
有什么方法可以在 UI 线程等待 WaitHandle 或其他线程原语时处理所有 Windows 消息? 我意识到它可能会产生非常困惑的重入问题;无论如何我都想做。 编辑:WAITING发生在必须在
在C#中,什么时候应该使用WaitHandle而不是lock? 最佳答案 锁从根本上不同于WaitHandle。用你写的锁,例如: lock (SomeResource) { // do st
我阅读了很多关于 TPL 的文章,并找到了我们可以使用取消机制的方法。但是我被 WaitHandle 困住了。 如果我想取消任务,我可以定义 CancellationTokenSource 并将它与任
假设我有 10N 个项目(我需要通过 http 协议(protocol)获取它们),在代码中启动了 N 个任务来获取数据,每个任务依次获取 10 个项目。我把元素放在 ConcurrentQueue
我有以下代码,其目标是等待所有给定的等待句柄,但可由特定的等待句柄取消: public static bool CancelableWaitAll(WaitHandle[] waitHandles,
编辑:我什至想为暂时的精神错乱辩护,甚至问这个问题,但当时它是有道理的(见下面的编辑 2)。 对于 .NET 3.5 项目,我有两种类型的资源(R1 和 R2)需要检查其可用性。每种资源类型在任何时候
我选择返回 Task和 Task从我的对象方法中提供 gui 的简单使用。一些方法只是等待其他类型的 waithandles 的互斥锁。有没有办法构造Task来自 WaitHandle.Wait()这
我正在尝试使用互斥锁来保护多个线程对某些硬件的访问,但我对 exitContext 的内容感到困惑参数意味着/做: public virtual bool WaitOne ( int mill
我有一个 Windows 设备驱动程序,我想移植到 Linux。 我们的用户空间应用程序经常需要等待驱动程序事件。这是我们在 Windows 上使用的机制: 应用程序创建一个 WaitHandle 应
假设我有这段代码: public class MyAsyncHandler : IHttpAsyncHandler { public IAsyncResult BeginPro
有人给我发邮件问我有没有WaitOneAndPump的版本对于 WPF。目标是等待句柄(类似于 WaitHandle.WaitOne )并在等待时在同一个堆栈框架上抽取 WPF 调度程序事件。 我真的
我是一名优秀的程序员,十分优秀!