Saya perhatikan dalam System.Threading.TimerBase.Dispose()
metode ini memiliki try{} finally{}
blok tetapi try{}
kosong.
Apakah ada nilai dalam menggunakan try{} finally{}
dengan kosong try
?
[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;
}
Jawaban:
Dari http://blog.somecreativity.com/2008/04/10/the-empty-try-block-mystery/ :
sumber
Thread.BeginCriticalRegion()
tidak mencegah utas dibatalkan, lebih baik memberitahukan runtime bahwa jika utas dibatalkan, maka negara global rusak, dan seluruh appdomain terserah pembunuhan rahmat.BeginCriticalSection()
benar-benar tidak ada di .NET 1.x, tetapi tidak ada sebab dan akibat, yang Anda maksudkan karena . Bahkan, dalam. NET 1.x, bahkan satufinally
blok bisa saja terganggu oleh ulir yang dibatalkan. Mekanisme-mekanisme ini memiliki tujuan yang berbeda: melakukan pekerjaan dalamfinally
mencegah aborsi di tengah jalan dalam kode, sementaraBeginCriticalSection()
hanya menyatakan kepada runtime bahwa negara global dalam bahaya.Ini untuk menjaga agar tidak
Thread.Abort
mengganggu proses. Dokumentasi untuk metode ini mengatakan bahwa:Ini karena untuk berhasil memulihkan dari kesalahan, kode Anda harus dibersihkan sendiri. Karena C # tidak memiliki destruktor gaya C ++,
finally
danusing
blok adalah satu-satunya cara yang dapat diandalkan untuk memastikan bahwa pembersihan tersebut dilakukan dengan andal. Ingat bahwausing
blok berubah menjadi ini oleh kompiler:Di .NET 1.x, ada kemungkinan
finally
blok akan dibatalkan. Perilaku ini diubah dalam .NET 2.0.Selain itu,
try
blok kosong tidak pernah dioptimalkan oleh kompiler.sumber
Dispose(false);
. docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…