logoЗаметки на клавиатуре


Потоки

Категории Uncategorized, опубликовал evilbot January 24th, 2006

Мда, как ни странно, но я за всё время программирования ни разу не работал с потоками. В теории я знал как с нмими работать, а в жизни не работал ни разу, т.е. все эти Mutex’ы, Семафоры и т.д. были чем-то фантастическим.
В проекте рисования читалки появилась необходимость читать RSS-Потоки и не подвешивать всю программу. Ну раз надо, значит надо, сделаем потоки, благо многопоточность в C# реализована очень хорошо и просто. Для создания нового потока, который вызывает нужную мне функцию пришлось написать совсем немного кода:

fmMain FetchForm = new fmMain();
System.Threading.Thread FetchThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(FetchForm.ThreadFetchRSS));

А вызов этого потока осуществляется одной функцией:

FetchThread.Start(Fd);

Создать новую форму потребовалось, т.к. функция ThreadFetchRSS не является статической. Будь она static, то для создания потока потребовалась бы всего одна строчка кода.
Но во всём этом оказалась одна "небольшая" проблемка, когда один поток записывает в документ скачанные RSS-Потоки, а другой читает из того же файла уже однажды скачанные потоки, то вылетает Exeption, я же не думал о потокобезопасности, когда писал этот код. А человек, который писал для меня работу с Xml, не думал о том, что я буду работать с многопоточностью.
В итоге для решения этой проблемы есть два варианта решения:

  • Простой: Сделать два XmlDocument’а, один для чтения, который будет храниться в памяти, другой для записи.
  • Сложный: Просто испльзуя встроенные средства языка синхронизировать работу потоков, что конечно заставит переписать часть кода работы с Xml.

В итоге мы скорее всего пойдём сложным путём, но и простой путь тоже будет использован, вот только в совершенно другом месте.

Оставить комментарий