我在多线程编程中难以理解的一件事是,当一个线程到达一个调用的行时,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();
}
Run Code Online (Sandbox Code Playgroud)
文件中有一些这样的方法(即RunThis(),RunThat()).这些方法在Windows服务中运行,并在Timer过去时调用.使用不同的定时器调用这些方法中的每一个并设置如下:
//Synchro
var timeBeforeFirstSync = TimeBeforeNextSync();
_syncTimer = new System.Timers.Timer(timeBeforeFirstSync.TotalMilliseconds);
_syncTimer.AutoReset = false;
_syncTimer.Elapsed += RunSync;
_syncTimer.Start();
Run Code Online (Sandbox Code Playgroud)
我知道当Timer过去时,该RunSync方法将运行.但当它击中WaitOne()线时,线程被阻塞.但是谁在等待?哪个"其他"线程会发送信号?
WaitHandle是一个抽象,如文档中所述:
\n\n\n封装等待独占访问共享资源的操作系统\xe2\x80\x93特定对象。
\n
您不知道涉及哪些其他线程,但通过检查句柄的使用情况(在您的情况下),您确实知道涉及哪些其他代码_mutex。每个WaitHandle派生类都会继承WaitOne,但成功等待后会发生什么以及如何发出信号是特定的。例如,在您的示例中,_mutex最有可能是一个Mutex类,因此WaitOne其行为类似于“等到它空闲并获取所有权”,而行为ReleaseMutex类似于“释放所有权和信号”。考虑到这一点,所有这些方法的作用应该是显而易见的——确保RunThis你不能做到这一点RunThat,反之亦然。
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |