我注意到System.Threading.TimerBase.Dispose()该方法中有一个try{} finally{}块,但try{}为空。
System.Threading.TimerBase.Dispose()
try{} finally{}
try{}
try{} finally{}与空值一起使用是否有任何价值try?
try
http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Threading&type=TimerBase
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal bool Dispose(WaitHandle notifyObject) { bool status = false; bool bLockTaken = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { do { if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) { bLockTaken = true; try { status = DeleteTimerNative(notifyObject.SafeWaitHandle); } finally { m_lock = 0; } } Thread.SpinWait(1); // yield to processor } while (!bLockTaken); GC.SuppressFinalize(this); } return status; }
从http://blog.somecreativity.com/2008/04/10/the-empty-try-block- mystery/:
这种方法可以防止Thread.Abort调用中断处理。Thread.Abort的MSDN页面说:“未执行的最终块在线程中止之前已执行”。因此,为了确保即使有人在线程上调用Abort中断了您的线程而在中间中断了处理,您也可以将所有代码放在finally块中(另一种方法是将代码写入“ catch”块中,以确定在“尝试”被Abort打断之前您在哪里,然后从那里继续进行)。