【问题标题】:Method calls from threads with a specific delay来自具有特定延迟的线程的方法调用
【发布时间】:2013-02-25 12:17:34
【问题描述】:

我需要同步一个方法调用,以便线程可以在 500 毫秒睡眠后调用这个方法。我有 10 个线程可能同时运行,所以简单地引入 Thread.Sleep(500) 并没有帮助。我怎样才能以最简单的方式实现这一目标?你有什么建议?

_pool = new Semaphore(0, 10);
_pool.Release(10);
...
pool.WaitOne();

Thread thr = new Thread(WorkerThread);
t.Start(param);
...
public static void WorkerThread(object parameterData)
{
    ...
    MethodToBeSynced();
    ...
    _pool.Release();
}

【问题讨论】:

  • 我不明白你的要求,对不起。为什么不能把 Sleep(500) 放在方法代码的最前面?
  • 假设两个线程同时启动。如果他们同时来到这个Sleep(500) 行,他们都会等待500ms,最终会同时调用我的方法。但是,我想要的是,如果一个线程正在执行这个方法,另一个线程应该等待 500ms 并开始执行。(当然,这应该对其余线程有效,如果它们尝试调用该方法)跨度>
  • 所以方法只能每500毫秒执行一次?听起来很奇怪,不是吗?
  • 嗯.. 我可能会将请求排队到一个线程,该线程具有队列等待的循环,does 方法,在请求中触发回调,Sleep(500) 并循环。也许这只是我:)
  • @Arno - 很奇怪,但并非令人难以置信。带有蹩脚、缓慢的外围设备的通讯会浮现在脑海中。

标签: c# multithreading thread-synchronization


【解决方案1】:

如果您知道并发线程的数量(并且假设它们大约在同一时间开始),您可以使用 BarrierPostPhaseAction 委托。

 var barrier = new Barrier(10, (x) => Thread.Sleep(500));

屏障会一直等待,直到 10 个线程处于某个代码点,一旦发生这种情况,每个线程将休眠 500 毫秒,然后继续。

如果确切的线程数未知,您可以指定等待超时以不无限阻塞。

// Waits up until N threads are at the barrier or after the timeout has elapsed.
 _barrier.SignalAndWait(500); 

【讨论】:

    【解决方案2】:

    使用 System.Threading.Timer

    你可以给它一个回调函数以及调用这个函数的时间间隔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多