Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание множества файлов в потоках 
:(
    Опции темы
ATV
Дата 18.6.2012, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.6.2012

Репутация: нет
Всего: нет



Добрый день!
В рамках изучения многопоточных приложений.
Пытаюсь создать перечень файлов, каждый файл  создается в отдельном потоке.
Подскажите, пожалуйста, правильно ли понята/реализована потокобезопасность кода (часть кода lock (locker) {..........})?
Заранее спасибо!
Код

class Program
    {
        delegate void runForceDelegate(string sInnerText, string sFileName, string userName);       

        static void Main(string[] args)
        {
            test tst = new test();

            runForceDelegate forceDelegate = new runForceDelegate( tst.createFile);
            object locker = new object(); /**Объект эксклюзивной блокировки*/

            string sFileName = "", sInnerText = "", suserName = "TEST_";
            /** планируется создать 15 потоков */
            for (int j = 0; j < 15; j++)
            {
               /*Блокируемый участок кода*/
                lock (locker)
                {
                    sFileName = tst.CreateRequestFileName(suserName);
                    sInnerText = sFileName;
                    forceDelegate.BeginInvoke(sInnerText, sFileName, suserName, null, null);                    
                }
            }          
            Console.ReadKey();
        }

        class test
        {
            Random random = new Random();

            public string CreateRequestFileName(string sParm)
            {
                string sFileName;                
                sFileName = sParm + "_"  + random.Next(0, 999999);
                return sFileName;
            }

            public void createFile(string sInnerText, string sFileName, string userName)
            {
                System.IO.File.WriteAllText(sFileName, sInnerText);
                System.Threading.Thread.Sleep(10000); /** Длительная операция **/
                return;
            }
        }       
    }

PM MAIL   Вверх
erm0l0v
Дата 18.6.2012, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: нет
Всего: 1



Проверить можно так.

Во время отладки программы откройте: Debug->Windows->Prarallel Stacks

Там вы сможете перекючаться между потоками и смотреть где остановлен каждый поток. Если все сделано правильно код будет выполняться только в одном потоке, а остальные потоки должны висеть на lock (locker).

В вашем случае код будет не потоко-безопасный lock нужно поставить в функции createFile, т.к. именно эта функция будет выполняться в потоке. Например можно
Код

System.IO.File.WriteAllText(sFileName, sInnerText);

обернуть в lock.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0976 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.