Странная периодическая ошибка при использовании TxNTFS - PullRequest
2 голосов
/ 26 июля 2011

Я использую транзакционную NTFS для чтения и записи в файлы в файловой системе, и я заметил, что приложение сталкивается с периодическими ошибками, которые разрешаются только при перезапуске приложения.Трассировка стека для ошибки:

System.Runtime.InteropServices.COMException (0xD0190052): Exception from HRESULT: 0xD0190052
   at ...KtmTransactionHandle.IKernelTransaction.GetHandle(IntPtr& handle)
   at ...KtmTransactionHandle.CreateKtmTransactionHandle(Transaction managedTransaction)
   at ...KtmTransactionHandle.CreateKtmTransactionHandle()
   at ...TransactedFile.Open(String path, FileMode mode, FileAccess access, FileShare share)
   at ...TransactedFile.ReadAllText(String path)

IKernelTransaction - интерфейс COM, к которому я обращаюсь:

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("79427A2B-F895-40e0-BE79-B57DC82ED231")]
    private interface IKernelTransaction
    {
        void GetHandle([Out] out IntPtr handle);
    }

здесь

IKernelTransaction tx = (IKernelTransaction)TransactionInterop.GetDtcTransaction(Transaction.Current);

Мой кодочень похож на http://msdn.microsoft.com/en-us/library/cc303707.aspx

Проблема в том, что я не могу найти информацию об этой ошибке COM 0xD0190052.Просто знать, что это за код ошибки, было бы очень полезно.

Спасибо

1 Ответ

1 голос
/ 26 июля 2011

Чистая спекуляцияHRESULT 0xD0190052 очень похож на STATUS_TRANSACTIONMANAGER_NOT_ONLINE, который равен 0xC0190052 ... разница в бите "N", который указывает, является ли код так называемым NTSTATUS (см. http://msdn.microsoft.com/en-us/library/0642cb2f-2075-4469-918c-4441e69c548a%28PROT.10%29.aspx и http://msdn.microsoft.com/en-us/library/cc231200%28v=PROT.10%29.aspxи http://msdn.microsoft.com/en-us/library/cc704588%28v=PROT.10%29.aspx) ...

Из того, что вы описываете, кажется, что либо ваше приложение иногда теряет соединение с менеджером транзакций, либо менеджер транзакций нестабилен / перезапущен или похож ...

Также определение PreserveSig(true) в вашем импорте COM может помочь получить некоторое описание HRESULT ...

Надеюсь, это имеет смысл в вашем случае ...

РЕДАКТИРОВАТЬ:

Я не уверен, что код, на который вы ссылаетесь, учитывает все возможности ... в методе TransactedFile.Open есть вызов scope.Complete();, который хорош и необходим, НО, если какой-то код перед этим вызовом внутриблок using генерирует исключение, которое не вызывается, что плохо согласно http://msdn.microsoft.com/en-us/library/ms172152.aspx

...