Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法调用具有特定延迟的线程_C#_Multithreading_Thread Synchronization - Fatal编程技术网

C# 方法调用具有特定延迟的线程

C# 方法调用具有特定延迟的线程,c#,multithreading,thread-synchronization,C#,Multithreading,Thread Synchronization,我需要同步一个方法调用,以便线程可以在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 Wor

我需要同步一个方法调用,以便线程可以在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();
}

使用System.Threading.Timer


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

如果您知道并发线程的数量(并且假设它们大约在同一时间启动),您可以使用带有
后期反应的
屏障

 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); 

对不起,我不明白你的要求。为什么不能将Sleep(500)放在方法代码的顶部呢?假设两个线程同时启动。如果他们同时来到这个
Sleep(500)
行,他们都会等待500毫秒,最终会同时调用我的方法。但是,我想要的是,如果一个线程正在执行这个方法,那么另一个线程应该等待500毫秒并开始执行(当然,如果其他线程试图调用这个方法,这对它们来说应该是有效的),所以这个方法只能每500毫秒执行一次?听起来很奇怪,不是吗?嗯。。我可能会将请求排队到一个线程,该线程使用queue wait、does方法进行循环,在请求中触发回调,休眠(500)并循环。也许那只是我:)@Arno-奇怪,但不是难以置信的。脑海中浮现出使用蹩脚、缓慢的外围设备的通信。