Как загрузить из относительного пути в приложении WPF?

Я посмотрел на драйвер indexDDB localForage по адресу https://github.com/localForage/localForage/blob/master/src/drivers/indexeddb.js . Я не вижу никакой буферизации. Следовательно, getItem нечего извлечь из некоторого буфера.

Более конкретно, снова обращаясь к источнику localForage, я вижу, что setItem и getItem являются основными обертками обещаний вокруг транзакций indexedDB. Эти оболочки разрешаются после завершения транзакций. Это говорит мне о том, что indexedDB управляет неблокирующим поведением, а не localForage.

Итак, поскольку indexedDB отвечает, это означает, что мы можем посмотреть на поведение indexedDB, чтобы помочь ответить на ваш вопрос. Мы выдаем две транзакции, каждая с запросом. Первая - это транзакция чтения-записи из setItem, а вторая - транзакция только для чтения из getItem.

Обычно транзакции могут перекрываться. Например, у вас может быть 100 транзакций только для чтения, запущенных одновременно. Однако транзакции readwrite блокируют другие транзакции для обеспечения целостности данных. транзакции readwrite не могут перекрываться.

1112 Это немного усложняется тем фактом, что вы можете выстрелить и забыть о вызовах. Вы можете инициировать две транзакции одновременно, не дожидаясь начала второй до тех пор, пока не завершится первая. Обратите внимание на разницу между началом чего-либо и фактическим выполнением.

Итак, глядя на ваш код, setItem('foo', 'bar') запускает транзакцию чтения-записи, а getItem ('foo') запускает транзакцию только для чтения. Вы не ждете, пока обертка обещания транзакции readwrite завершится, прежде чем начать транзакцию только для чтения.

Хотя это действительно неблокирующий подход на поверхности, он все еще технически блокирует на уровне indexedDB, потому что транзакция только для чтения будет блокировать (ждать, неопределенно) до завершения предыдущей транзакции чтения-записи в том же хранилище объектов.

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

Следовательно, вы можете сказать, что ответ будет А. Потому что транзакция только для чтения должна ждать завершения транзакции чтения и записи. Он неопределен на уровне обещаний localForage, но определен на уровне транзакций indexedDB.

Посмотрите спецификацию для более подробного технического объяснения на https://www.w3.org/TR/IndexedDB-2/#transaction-construct

. Вот соответствующий раздел (выделено мной):

Если несколько транзакций чтения / записи пытаются получить доступ к одному и тому же хранилищу объектов (т. е. если они имеют перекрывающуюся область видимости), то транзакция, которая была создана первой, должна быть транзакцией, которая получает доступ в хранилище объектов в первую очередь. Из-за требований предыдущего параграфа это также означает, что это единственная транзакция, которая имеет доступ к хранилищу объектов до тех пор, пока транзакция не будет завершена.

Любая транзакция, созданная после транзакции чтения / записи, должна видеть изменения, записанные транзакцией чтения / записи. Таким образом, если транзакция чтения / записи A создается, а затем создается другая транзакция B, и эти две транзакции имеют перекрывающиеся области, то B должен видеть любые изменения, внесенные в любые хранилища объектов, которые являются частью этой перекрывающейся области. Из-за требований предыдущего параграфа это также означает, что транзакция B не имеет доступа ни к каким хранилищам объектов в этой перекрывающейся области, пока транзакция A не будет завершена.

Вообще говоря, вышеприведенные требования означают, что любая транзакция, которая имеет перекрывающуюся область с транзакцией чтения / записи и которая была создана после этой транзакции чтения / записи, не может выполняться параллельно с этой транзакцией чтения / записи. [1121 ] BLOCKQUOTE>

8
задан Kent Boogaart 30 April 2009 в 09:37
поделиться

2 ответа

XDocument xmlDoc = XDocument.Load(@"Data\customers.xml");

ИЛИ

XDocument xmlDoc = XDocument.Load(@".\Data\customers.xml");

Кстати, это не имеет никакого отношения к WPF и всему, что связано с путями Windows.

8
ответ дан 5 December 2019 в 06:24
поделиться
XDocument xmlDoc = XDocument.Load(
    Path.Combine(
        AppDomain.CurrentDomain.BaseDirectory, 
        @"Data\customers.xml"));

Я предполагаю, что данные каталог будет развернут с вашим приложением, в том же корневом каталоге, что и ваш EXE. Обычно это безопасно, кроме случаев, когда используется теневое копирование; например, когда вы используете NUnit для тестирования этого кода. (С теневым копированием,

17
ответ дан 5 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: