我在多线程编程中难以理解的一件事是,当一个线程到达调用WaitOne()
的行时,我如何知道涉及哪些其他线程?我在哪里或如何找到(或理解)WaitHandle
如何接收信号?例如,我现在正在看这个代码:
private void RunSync(object state, ElapsedEventArgs elapsedEventArgs)
{
_mutex.WaitOne();
using (var sync = GWSSync.BuildSynchronizer(_log))
{
try
{
sync.Syncronize();
}
catch(Exception ex)
{
_log.Write(string.Format("Error during synchronization : {0}", ex));
}
}
_mutex.ReleaseMutex();
_syncTimer.Interval = TimeBeforeNextSync().TotalMilliseconds;
_syncTimer.Start();
}
文件中有一些这样的方法(即RunThis(),RunThat())。这些方法在Windows服务中运行,并在Timer过去时调用。使用不同的定时器调用这些方法中的每一个并设置如下:
//Synchro
var timeBeforeFirstSync = TimeBeforeNextSync();
_syncTimer = new System.Timers.Timer(timeBeforeFirstSync.TotalMilliseconds);
_syncTimer.AutoReset = false;
_syncTimer.Elapsed += RunSync;
_syncTimer.Start();
据我所知,当Timer过去时,RunSync
方法将会运行。但当它到达WaitOne()
行时,线程被阻止。但是谁在等待?哪个“其他”线程会发送信号?
答案 0 :(得分:1)
WaitHandle
是一个抽象,如文档中所述:
封装等待独占访问共享资源的特定于操作系统的对象。
您不知道涉及哪些主题,但 通过检查其使用情况来了解涉及哪个代码句柄(_mutex
在你的情况下)。每个WaitHandle
派生类都继承WaitOne
,但成功等待后会发生什么以及如何发出信号是特定的。例如,在您的示例_mutex
中,Mutex
类很可能是WaitOne
类,因此ReleaseMutex
的行为类似于“等到它空闲并取得所有权”,而RunThis
则表示“释放”所有权和信号“。考虑到这一点,所有这些方法的作用应该是显而易见的 - 确保RunThat
时{{1}}不能{{1}},反之亦然。