- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直注意到对 WaitHandle.WaitAny 的调用会分配给它的 WaitHandle[] 的副本。从下面的链接或使用反射器可以看出:
相关代码为:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
{
if (waitHandles==null)
{
throw new ArgumentNullException("waitHandles");
}
if (MAX_WAITHANDLES < waitHandles.Length)
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_MaxWaitHandles"));
}
if (-1 > millisecondsTimeout)
{
throw new ArgumentOutOfRangeException("millisecondsTimeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
}
WaitHandle[] internalWaitHandles = new WaitHandle[waitHandles.Length];
for (int i = 0; i < waitHandles.Length; i ++)
{
WaitHandle waitHandle = waitHandles[i];
if (waitHandle == null)
throw new ArgumentNullException(Environment.GetResourceString("ArgumentNull_ArrayElement"));
if (RemotingServices.IsTransparentProxy(waitHandle))
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_WaitOnTransparentProxy"));
internalWaitHandles[i] = waitHandle;
}
#if _DEBUG
// make sure we do not use waitHandles any more.
waitHandles = null;
#endif
int ret = WaitMultiple(internalWaitHandles, millisecondsTimeout, exitContext, false /* waitany*/ );
for (int i = 0; i < internalWaitHandles.Length; i ++)
{
GC.KeepAlive (internalWaitHandles[i]);
}
if ((WAIT_ABANDONED <= ret) && (WAIT_ABANDONED+internalWaitHandles.Length > ret))
{
int mutexIndex = ret -WAIT_ABANDONED;
if(0 <= mutexIndex && mutexIndex < internalWaitHandles.Length)
{
throw new AbandonedMutexException(mutexIndex,internalWaitHandles[mutexIndex]);
}
else
{
throw new AbandonedMutexException();
}
}
else
return ret;
}
现在我的问题是为什么?这是否可以规避(即编写自己的 WaitHandle.WaitAny 副本)?也许为什么不呢?
这意味着我的系统中有很多不必要的内存分配。由于低级别的方式,我们将其与多个 WaitHandles 一起使用。
请留在主题上,不要提及任务并行库或类似库;)我们在这里讨论的是 GC 压力很重要的高性能场景。
最佳答案
WaitMultiple
需要能够指望 WaitHandle
没有被垃圾回收。如果发生这种情况,可能会由于内存损坏或某些类似的问题而导致访问冲突。
我们的想法是,您应该能够调用 WaitMultiple
并销毁一个或多个 WaitHandle
对象,而 WaitAny
不会失败。如果它不创建一个副本,这将是不可能的,并且调试那个特定场景会花费你一整天的时间。所以最重要的是,它是为了线程安全而完成的。
如果您查看底层 native 函数的文档,WaitForMultipleObjects ,有证据表明:行为被描述为未定义:
If one of these handles is closed while the wait is still pending, the function's behavior is undefined.
如下文所建议的,如果充分利用它的所有性能很重要,您可以确保不释放 WaitHandles,并对 WaitForMultipleObjects 进行 p/invoke 调用。您可以提供 WaitHandle.SafeWaitHandle
作为相关同步对象的句柄。
编辑:上面给出的答案是错误的。我不时回到这个问题,因为它困扰着我;我现在相信我有一个正确的答案。
这种元素传输的目的是对各个 WaitHandle
进行线程安全验证。如果开发人员要使用原始数组,则其元素之一可能会被覆盖,例如 null
值,这将导致底层 native 函数出现未定义的行为。通过将元素复制到内部数组中,我们可以检查每个元素,如果它为 null
或无效则抛出异常,然后存储它。我们知道内部数组的元素不能被替换。因此,为了您很久以前的目的,如果您不做一些奇怪的事情,例如将 null 或跨 AppDomain 元素放入您的 WaitHandle 数组,您就可以了。
关于c# - WaitHandle.WaitAny 每次调用时都会分配 WaitHandle[] 的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15367599/
我一直注意到对 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 调度程序事件。 我真的
我是一名优秀的程序员,十分优秀!