标签: manualresetevent

ManualResetEvent在处于等待状态时会消耗cpu吗?

更具体地说,上下文切换的性能下降是否适用于处于等待状态的线程?

在什么条件或情况下,ManualResetEvent或WaitHandle可能会消耗资源?

c# manualresetevent

4
推荐指数
1
解决办法
1188
查看次数

如果在Set()之后立即调用Reset(),则ManualResetEvent.WaitOne()不会返回

我在生产服务中遇到一个问题,它包含一个"看门狗"计时器,用于检查主处理作业是否已经冻结(这与COM互操作问题有关,遗憾的是,在测试中无法再现).

以下是它目前的工作原理:

  • 在处理过程中,主线程重置a ManualResetEvent,处理单个项目(这不应该花费很长时间),然后设置事件.然后它继续处理任何剩余的项目.
  • 每隔5分钟,看门狗就会召集WaitOne(TimeSpan.FromMinutes(5))这次活动.如果结果为false,则重新启动服务.
  • 有时,在正常操作期间,该监视器正在重新启动该服务,即使处理过程不会接近5分钟.

原因似乎是当多个项目等待处理时,处理Set()第一个项目之后和处理Reset()第二个项目之间的时间太短,并且WaitOne()似乎没有认识到事件已被设置.

我的理解WaitOne()是被阻塞的线程Set()被调用时保证会收到一个信号,但我想我错过了一些重要的东西.

请注意,如果我在调用Thread.Sleep(0)后通过调用允许上下文切换Set(),则WaitOne()永远不会失败.

下面包含一个与我的生产代码产生相同行为的示例.WaitOne()有时会等待5秒并失败,即使Set()每800毫秒调用一次.

private static ManualResetEvent _handle;

private static void Main(string[] args)
{
    _handle = new ManualResetEvent(true);

    ((Action) PeriodicWait).BeginInvoke(null, null);
    ((Action) PeriodicSignal).BeginInvoke(null, null);

    Console.ReadLine();
}

private static void PeriodicWait()
{
    Stopwatch stopwatch = new Stopwatch();

    while (true)
    {
        stopwatch.Restart();
        bool result = _handle.WaitOne(5000, false);
        stopwatch.Stop();
        Console.WriteLine("After …
Run Code Online (Sandbox Code Playgroud)

c# multithreading .net-4.0 manualresetevent

4
推荐指数
2
解决办法
2万
查看次数

使用参数延迟初始化单例

我正在尝试创建一个具有非空构造函数的单例并以同步方式访问它:因为我无法控制组件的初始化顺序,如果组件在初始化之前访问单例,则必须等待.

工厂方法只调用一次,我的启动阶段抛出异常

private static volatile GottwareExcelAddin _instance;   
private static readonly ManualResetEvent InitializedEvent=new ManualResetEvent(false);

    internal static Singleton CurrentInstance
    {
        get
        {
            InitializedEvent.WaitOne();
            return _instance;
        }
    }

    #endregion

    private Singleton(String url, Int otherstuff)
    {
       // do stuff
        InitializedEvent.Set();
    }


    #region public factory
    [OnWorkerThread]
    public static void Singleton(String spaceUrl, _Application excelApp)
    {
        if (_instance == null)
            _instance = new Singleton(spaceUrl, excelApp);
    }
Run Code Online (Sandbox Code Playgroud)

[OnWorkerThread]是一个使工厂在工作线程上运行的属性,工厂只调用一次.

当我启动myapp时,有时我会得到以下内容:

异常源:mscorlib异常类型:System.Runtime.InteropServices.SEHException异常消息:外部组件引发了异常.异常目标站点:WaitOneNative

---- Stack Trace ---- System.Threading.WaitHandle.WaitOneNative(waitableSafeHandle As SafeHandle,millisecondsTimeout As UInt32,hasThreadAffinity As Boolean,exitContext As Boolean)AddinExpress.RTD.2005.dll:N 00000(0x0)JIT System. Threading.WaitHandle.InternalWaitOne(waitableSafeHandle As SafeHandle,millisecondsTimeout …

.net singleton multithreading manualresetevent

3
推荐指数
1
解决办法
3553
查看次数

条件事件等待/ ManualResetEvent

我知道如何使用ManualResetEvent或同步原语(如Monitor)来等待事件和/或锁,但我想知道是否有办法实现如下所示:

ManualResetEvent resetEvent; 

public string WaitForOneThousandMs()
{
    resetEvent.Wait(1000);

    if (WaitTime(resetEvent) <= 1000)
        return "Event occured within 1000ms."; 
    else
        return "Event did not occur within 1000ms."; 
}
Run Code Online (Sandbox Code Playgroud)

1)等待1000ms以发生事件X.

2)如果事件发生在1000ms内,则执行路径A.

3)否则,执行路径B.

这基本上是一个条件等待函数,其中条件是我们必须等待多长时间,如果可能的话,实现它的最佳方法是什么?

c# events multithreading synchronization manualresetevent

3
推荐指数
1
解决办法
1348
查看次数

如何在objective-c中的指定时间唤醒线程

我正在Objective-c中编写一个ssh包装器,我正在尝试实现一个命令应该执行的maxTime.我实现它的方式是:

主线程:

  1. 计算超时
  2. 创建asyncThread(GCD队列)以执行命令并解析返回的数据
  3. waitForTimeoutOrSignal
  4. 返回结果

AsyncThread:

  1. 执行命令
  2. 获得返回的数据
  3. 如果收到正确的数据信号MainThread

在C#中,我使用ManualResetEvents向MainThread发出信号,取得了很大的成功.在Objective-C中,我能找到的最接近的类是NSCondition,但似乎它不是为线程间通信而构建的.

事实上,我得到:

2012-05-22 00:31:05.761 libssh2-for-iOS [60821:11303]** - [NSCondition解锁]:条件('(null)')从没有锁定它的线程解锁

2012-05-22 00:31:05.763 libssh2-for-iOS [60821:11303]**打破_NSLockError()进行调试.

当我尝试使用它时.是否有另一种方法可以使用NSCondition或更好的方式让线程睡眠,直到它收到某种信号?

multithreading locking objective-c manualresetevent nscondition

2
推荐指数
1
解决办法
1732
查看次数

控制台应用程序在执行回调之前退出

我有一个控制台应用程序执行类方法(在另一个项目中).此方法异步执行对Web服务的POST(这是3分钟的冗长操作)并且具有回调,该回调返回受POST影响的记录数.与此同时,程序继续执行其他不到3分钟的事情,程序在回调返回之前退出.

在过去,我使用了如下所示的ManualResetEvent来防止完成,但在这种情况下,我的方法是在一个不同的类库中,我希望尽可能保持干净.


static ManualResetEvent resetEvent = new ManualResetEvent(false)

static void Main()
{
     CallAsyncMethod();
     // Do other things...
     resetEvent.WaitOne(); // Blocks until "set"
}

void AsyncMethodCallback()
{
     // Do processing on completion...
     resetEvent.Set(); // Allow the program to exit
}
Run Code Online (Sandbox Code Playgroud)

如果没有用执行标志来污染被调用的类,我会感激任何帮助,想出一个干净的模式来完成这个任务.

c# asynchronous callback manualresetevent c#-4.0

0
推荐指数
1
解决办法
1707
查看次数