Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
4 / 5 / 1
Регистрация: 25.05.2012
Сообщений: 262
Записей в блоге: 1

Логирование при использовании многопоточности

04.09.2018, 16:12. Показов 5336. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Программа качает файлы из списка адресов. Делает это асинхронно. О результате пишет в лог-файл. При запуске программы постоянно вылетает эксепшен о недоступности файла, поскольку он используется другим процессом. Хотелось бы понять почему. Я предполагаю, что каждый таск пытается создать новый объект StreamWriter в своем потоке - из-за этого другие потоки теряют возможность этот файл использовать.
Вопрос:
1. Верно ли я понял причину?
2. Как заставить таски создавать объект StreamWriter всякий раз в одном и том же потоке?
3. Не будет ли у них опять взаимной блокировки и как ее избежать?

Код:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace AsyncAwaitTest
{
    class Program
    {
        public static object Threadpool { get; private set; }
 
        static void Main(string[] args)
        {
 
            List<string> urlList = new List<string>()
            {
                "http://www.uc.atr-group.ru/crl.crl",
                "http://update.formatlink.ru/1/flca002.crl",
                "http://crl.domostroitel-it.ru/public/ee293cbf63af7780277b1e7c52854e09972850e5.crl",
                "http://ca.domostroitel-it.ru/ra/cdp/ee293cbf63af7780277b1e7c52854e09972850e5.crl",
                "http://uc.itech-systems.com/crl/ITS.crl",
                "http://ca.binteh.ru/file/bintehca.crl",
                "http://gwusr.binteh.ru/cdp/bintehca.crl",
                "http://certenroll.mruc.ru/mruc2013.crl",
                "http://mruc.ntl.ru/mruc2013.crl",
                "http://mescrl.mosenergosbyt.ru/info/bd6e70a83de8e50ddeeb3c05584f06ae120ecf34.crl",
                "http://cdp.ifdk.com/ifdk-ca/cert.crl",
                "http://www.teledoc.ru/assets/documents/teledoc.crl"
 
            };
 
            DownloadAllFromUrlList(urlList);
 
        }
 
        private static void DownloadAllFromUrlList(List<string> urlList)
        {
            foreach (string url in urlList)
            {
                DownloadAsync(url);
            }
        }
 
        private static async void DownloadAsync(string url)
        {
            HttpClient client = new HttpClient();
            int rezultStringLength = 0; 
 
            try
            {
                Task<string> downloadStringTask = client.GetStringAsync(url);
 
                string rezultString = await downloadStringTask;
 
                rezultStringLength = rezultString.Length;
            }
            catch (Exception e)
            {
                Logger.Write(e.Message);
            }
 
            Logger.Write($"Строка с {url} получена. Длина строки = {rezultStringLength}");
        }
    }
 
    //Класс логгера
    internal static class Logger
    {
        internal static void Write(string text)
        {
            using (StreamWriter streamWriter = new StreamWriter($@"log.txt", append:true))
            {
                streamWriter.WriteLine(String.Format($"{DateTime.Now} : {text}"));
            }
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.09.2018, 16:12
Ответы с готовыми решениями:

Программа вычисления выражения работает некорректно при использовании многопоточности
Нужно рассчитать выражение (см. Миниатюры). В один поток всё работает хорошо: static double Expr(uint cycleCount) { ...

Зависает при многопоточности
Доброе время суток.Помогите советом, несколько дней бьюсь, все перепробовал. Никак не могу разобраться в чем проблема, есть dll, которая...

File.OpenRead при многопоточности
Всем привет! Есть код: public class FileHandler { private static object _lock = new object(); ...

26
4 / 5 / 1
Регистрация: 25.05.2012
Сообщений: 262
Записей в блоге: 1
07.09.2018, 09:07  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kolorotur Посмотреть сообщение
Нормальный вопрос, просто я не понял.
Поясните, пожалуйста.
Почему-то я подумал, что у меня не считалось выражение типа:
C#
1
Console.WriteLine($"2+3={2+3}");
Проверил - считается всё нормально. Что логично.
Спросил из того соображения, что если всё же есть ситуации, в которых подобная логика нарушается, то вы их припомните.

Надеюсь понятно объяснил
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
07.09.2018, 20:49
С помощью делегата создаешь внутри потока событие если не ошибаюсь
или есть такая штука как Inwork можно ею запускать методы
0
4 / 5 / 1
Регистрация: 25.05.2012
Сообщений: 262
Записей в блоге: 1
14.09.2018, 16:22  [ТС]
Подскажите, пожалуйста, как в данном случае мне передавать в новый (и единственный) экземпляр логгера параметр (путь и имя файла лога)?
C#
1
private static readonly Lazy<Logger> instance = new Lazy<Logger>(() => new Logger());
0
296 / 125 / 106
Регистрация: 30.10.2015
Сообщений: 690
15.09.2018, 04:03
Цитата Сообщение от Wolflind Посмотреть сообщение
есть такая штука как Inwork
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
16.09.2018, 09:43
Nemovok, Form.Inwork(метод,входные_параметры) будет выполнено в потоке формы
Form объект формы если внутри формы код то this
1
4 / 5 / 1
Регистрация: 25.05.2012
Сообщений: 262
Записей в блоге: 1
21.03.2019, 17:05  [ТС]
kolorotur, нужна ваша помощь:

вы мне предложили решение для организации логирования, а именно:

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
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
 
namespace CrlDownloader
{
    //Класс логгера
    public class Logger : IDisposable, IOutput
    {
        private static readonly Lazy<Logger> instance = new Lazy<Logger>(() => new Logger());
        private bool disposed;
        private string logPath;
        private readonly StreamWriter streamWriter;
        private readonly object sync = new object();
 
        public static Logger Instance => instance.Value;
 
        public Logger()
        {
            string value = $@"{ConfigurationManager.AppSettings["systemPath"]}\log";
            logPath = $@"{value}\log{DateTime.Now.ToString("yyMMddHHmmss")}.txt";
            
            streamWriter = new StreamWriter(logPath, append: true);
        }
 
        public void Write(string text)
        {
            lock (sync)
            {
                streamWriter.WriteLine(String.Format($"{DateTime.Now} : {text}"));
            }
        }
 
        public void Dispose()
        {
            if (disposed) return;
            if (streamWriter != null)
            {
                streamWriter.WriteLine(String.Format($"\n\n")); //для читабельности лога
                streamWriter.Dispose();
            }
        }
Я в целях тестирования решил вызывать код метода Main() несколько раз, но при второй итерации появляется ошибка:
Code
1
'Запись в закрытый TextWriter невозможна.'
Проверил, действительно StreamWriter пустой. Но почему?
Ведь мы его удалили в методе Dispose():

C#
1
2
3
4
5
 if (streamWriter != null)
            {
                streamWriter.WriteLine(String.Format($"\n\n")); //для читабельности лога
                streamWriter.Dispose();
            }

Буду очень благодарен если объясните что к чему.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
21.03.2019, 18:23
Цитата Сообщение от skitale Посмотреть сообщение
объясните что к чему.
Покажите код, который производил тестирование.

А в целом имеет смысл не изобретать колесо, а использовать любой из груды готовых логгеров.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2019, 18:23

Ошибка при реализации многопоточности
Помогите с кодом Многопоток newthread = new Thread(funk); newthread.Start(); ...

Работа с переменными при многопоточности
Всем привет. Недавно начал работать с много поточностью и при работе с большими ресурсами (такие как List) я использую конструкцию...

Работа статического метода при многопоточности?
Всем привет, начал изучать потоки. Автор курса, который я прохожу, привел пример работы с статическими методами при многопоточности - где...

Странные символы при выводе в файл при использовании BinaryWriter
Здравствуйте, вопрос, может, тупой, но что-то я пока не догоняю. При выводе в файл: BinaryWriter o; try { ...

Как правильно передать объект в функцию при использовании многопоточности
Добрый день, форум! Возникла вот такая задача: Есть два класса: класс А, реализующий интегрирование функции, и класс В, реализующий...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru