Помоги мне понять. Я прочитал это
«Время и порядок исполнения финализаторов не могут быть предсказаны или предопределены»
Правильно?
Однако, глядя на исходный код RavenDB TransactionStorage.cs, я вижу это
~TransactionalStorage()
{
try
{
Trace.WriteLine(
"Disposing esent resources from finalizer! You should call TransactionalStorage.Dispose() instead!");
Api.JetTerm2(instance, TermGrbit.Abrupt);
}
catch (Exception exception)
{
try
{
Trace.WriteLine("Failed to dispose esent instance from finalizer because: " + exception);
}
catch
{
}
}
}
Класс API (который принадлежит Managed Esent), который предположительно обрабатывает собственные ресурсы, предположительно, с помощью SafeHandle?
Так что, если я правильно понимаю, собственные дескрипторы SafeHandle могут быть завершены до TransactionStorage, что может привести к нежелательным эффектам, возможно, почему Ayende добавил предложение catch all вокруг этого?
На самом деле, углубляясь в Esent-код, он не использует SafeHandles.
Согласно CLR через C # это опасно?
internal static class SomeType {
[DllImport("Kernel32", CharSet=CharSet.Unicode, EntryPoint="CreateEvent")]
// This prototype is not robust
private static extern IntPtr CreateEventBad(
IntPtr pSecurityAttributes, Boolean manualReset, Boolean initialState, String name);
// This prototype is robust
[DllImport("Kernel32", CharSet=CharSet.Unicode, EntryPoint="CreateEvent")]
private static extern SafeWaitHandle CreateEventGood(
IntPtr pSecurityAttributes, Boolean manualReset, Boolean initialState, String name)
public static void SomeMethod() {
IntPtr handle = CreateEventBad(IntPtr.Zero, false, false, null);
SafeWaitHandle swh = CreateEventGood(IntPtr.Zero, false, false, null);
}
}
Управляемое Esent (NativeMEthods.cs) выглядит следующим образом (используя Ints против IntPtrs?):
[DllImport(EsentDll, CharSet = EsentCharSet, ExactSpelling = true)]
public static extern int JetCreateDatabase(IntPtr sesid, string szFilename, string szConnect, out uint dbid, uint grbit);
Правильно ли обрабатывается завершение / удаление Managed Esent, и, во-вторых, RavenDB обрабатывает финализатор правильным способом или компенсирует Managed Esent?