ASP.NET параллелизм - PullRequest
       17

ASP.NET параллелизм

3 голосов
/ 16 августа 2010

Предположим, у меня есть a.aspx и b.aspx оба с функцией f .

У меня также есть экземпляр объекта, o , который содержится в сеансе.

У каждого клиента есть сценарии ajax, которые вызывают a.f и b.f асинхронно.

a.f вызывает o.ReadData

b.f звонки o.ReadData

Объект o поддерживает один дескриптор открытого файла от инстагации до его удаления.

Есть ли проблемы с одновременным доступом к файлу в o? Почему или почему нет?

Ответы [ 3 ]

1 голос
/ 16 августа 2010

a.aspx и b.aspx - это отдельные страницы;поэтому они могут быть запрошены параллельно, и, скорее всего, это будет делать браузересли оба используются вашим скриптом AJAX.Двухстраничные запросы, вероятно, будут выполняться в двух отдельных потоках;если они запрашиваются примерно в одно и то же время.

Эти объекты совместно используют один объект;у которого есть открытый файл.Это проблема параллелизма - a и b могут одновременно обращаться к объекту.Таким образом, чтение по b может быть не из того места, которое вы ожидаете;или хуже, вы можете записать не ту часть файла, если вы пишете.

При любых обстоятельствах;Я не хотел бы помещать открытый файл в объект Session.Как вы знаете, когда закрыть файл?Там может быть утечка ресурсов.

0 голосов
/ 16 августа 2010

Ответ из того, что вы сказали до сих пор, "вероятно".

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

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

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

Если под «содержит дескриптор файла», вы имеете в виду, что у него есть объект File, и он вызывает File.OpenRead каждый раз, когда его используют, перед удалением потока, возвращенного в том же вызове, то этохорошо.Однако, если вы имеете в виду, что у вас есть поток, возвращаемый File.OpenRead, а вы Seek перед каждым чтением, то у вас возникает проблема параллелизма.

Хотя для однопоточного консольного приложения это может быть более эффективнымоткрыть поток с помощью OpenRead, а затем Seek, если вам нужно снова посмотреть на начало файла, с многопоточным приложением (и весь ASP.NET по своей сути является многопоточным, даже если вы никогда явно не создаете поток)гораздо, гораздо эффективнее звонить OpenRead каждый раз, когда вам нужно.

0 голосов
/ 16 августа 2010

Если файл доступен только для чтения, у вас не возникнет никаких проблем.

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

Этот вопрос SO касается общей проблемы: Несколько потоков, читающих из одного файла

Как следует из этой ссылки, важно, чтобы дескриптор файла был ориентирован на локальную память для потока, а не на общую. Если ReadData просто открывает сам файл, все в порядке. Однако, если некоторая статическая функция использует глобальную переменную var для хранения всегда открытого дескриптора файла, вы можете столкнуться с проблемами. Поэтому обязательно откройте его в потоке функции с локальной переменной / стеком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...