Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
19 / 19 / 4
Регистрация: 18.02.2011
Сообщений: 292
1

Отказ в доступе на запись в файл из пятидесяти потоков

26.09.2012, 17:07. Показов 2093. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я использую класс StreamWriter для записи данных в файл, это происходит сразу в 50 потоках. Мне выдается исключение "Процесс не может получить доступ к файлу". Не знаю в чем проблема, кто знает что делать прошу ответить в теме.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2012, 17:07
Ответы с готовыми решениями:

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

Отказ в Доступе !!!
Всем привет ! Вопщем скачал Адаптер для л2, раньше все было нормально качал ево не один раз,но...

Отказ в доступе
Я программно создаю в директории C:\Windows папку с фалами, но при выполнении этой программе мне...

Отказ в доступе
Привет. Выскакивает сообщение: "отказано в доступе к указанному устройству...", когда пытаюсь...

15
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
26.09.2012, 17:56 2
Проблема в том, что файл уже используется другим потоком.
0
19 / 19 / 4
Регистрация: 18.02.2011
Сообщений: 292
26.09.2012, 20:32  [ТС] 3
kolorotur, это понятно. А как эту проблему обойти, чтобы все потоки добавляли в файл данные.
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
26.09.2012, 23:14 4
Открыть файл в режиме FileShare.Write и синхронизировать потоки.
1
19 / 19 / 4
Регистрация: 18.02.2011
Сообщений: 292
27.09.2012, 20:48  [ТС] 5
kolorotur, синрхонизировать - это разделить между ними работу ?
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
27.09.2012, 21:08 6
PaZL, нет, это реализовать механизм, при котором только один из потоков записывает что-то в файл в конкретный момент времени.
0
24 / 23 / 3
Регистрация: 21.04.2012
Сообщений: 253
27.09.2012, 23:01 7
lock ?
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
27.09.2012, 23:42 8
Да, как один из возможных методов синхронизации.
0
19 / 19 / 4
Регистрация: 18.02.2011
Сообщений: 292
27.09.2012, 23:59  [ТС] 9
kolorotur, а почему нельзя сделать, чтобы все потоки писали в файл - использую конструкцию using.
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
28.09.2012, 01:54 10
PaZL, дык потому что ерунда получится, а не запись.
Один поток одно пишет, другой поток тут же другое, в итоге в файле все в кучу будет.
using лучше не использовать в подобном сценарии. Откройте один Stream и на него синхронизируйте все потоки.
А еще лучше для записи в лог создать выделенный поток, который будет доставать логи из очереди и тупо писать их в файл, а остальные 50 потоков будут просто добавлять свои записи в очередь. В результате все быстрее работать будет.
0
19 / 19 / 4
Регистрация: 18.02.2011
Сообщений: 292
28.09.2012, 17:34  [ТС] 11
kolorotur, а как ставить в очередь. Добавлять в List<string> ?
0
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
28.09.2012, 17:57 12
Цитата Сообщение от PaZL Посмотреть сообщение
а как ставить в очередь. Добавлять в List<string> ?
Ну да! Заведите лист! И пусть все потоки в него добавляют записи а один поток берёт нулевой элемент и пишет его в файл!

Добавлено через 1 минуту
Есть кстати какая то коллекция потокобезопасная в которую могут добавлять данные кучи потоков! Но название её я не помню!

Добавлено через 4 минуты
Вот выбирай : http://msdn.microsoft.com/ru-r... rrent.aspx
0
19 / 19 / 4
Регистрация: 18.02.2011
Сообщений: 292
28.09.2012, 18:41  [ТС] 13
LeniumSoft, А чем обычный лист не годен ? Потокобезопасный это как ? Если что не так, извините за тупые вопросы. С потоками только начал работать.
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
28.09.2012, 18:50 14
Цитата Сообщение от PaZL Посмотреть сообщение
А чем обычный лист не годен ?
Тем, что при добавлении/удалении тоже синхронизироваться придется вручную. Ну и само удаление из начала списка - не самая быстрая операция при большом количестве элементов.

Вот вам пример того, о чем я писал выше:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
static BlockingCollection<string> queue = new BlockingCollection<string>();
 
static void Main()
{
   // Этот поток не будет заниматься ничем, кроме записи логов в файл.
   Thread logWriter = new Thread(WriteLogs);
   logWriter.Start();
 
   // Это 50 потоков, которые будут что-то делать и добавлять результат своей деятельности в очередь на запись в файл логов
   for (int i = 0; i < 50; i++)
      new Thread(Work).Start();
 
   Console.ReadLine();
}
 
static void WriteLog(string log)
{
   queue.Add(log);
}
 
static void WriteLogs()
{
   using (var file = new StreamWriter(File.Create("logs.log"))
      foreach (var log in queue.GetConsumingEnumerable())
         file.WriteLine(log);
}
 
static void Work()
{
   while (true)
   {
      Thread.Sleep(100); // Типа что-то делаем
      WriteLog(Guid.NewGuid().ToString()); // Записать что-нибудь в лог
   }
}
Как видите, непосредственно с файлом работает только один поток, все остальные лишь добавляют свои логи в очередь, в качестве которой используется потокобезопасная коллекция.
1
19 / 19 / 4
Регистрация: 18.02.2011
Сообщений: 292
28.09.2012, 18:51  [ТС] 15
Когда я пытаюсь записать List в файл - мне выдает, что коллекция уже изменена. С потокобезопасным этого уже не будет ?
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
28.09.2012, 18:53 16
PaZL, попробуйте мой пример выше.
Если сработает - адаптируйте под свои нужды.

А ваша ошибка скорее всего связана с тем, что вы список пытаетесь как-то изменить в блоке foreach, что запрещено.
1
28.09.2012, 18:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2012, 18:53
Помогаю со студенческими работами здесь

Отказ в доступе
Всем здрасте! Возможно я глобальный &quot;лох&quot;, но всё же. Было задание написать лендинг (вёрстка и...

Отказ в доступе
по рекомендации одного советчика скачал прогу Суперокна а в проге зараза самое неприятное что...

Ошибка,отказ в доступе
Помогите советом умоляю!2 дня бьюсь над этой проблемой!:(соединил 2 компьютера,настроил все как...

Отказ в доступе к интернету
Перестал работать интернет во всех браузерах, но заметил что при включении касперского чащще всего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru