Многопоточные приложения в Visual Studio.NET. Разработка приложения, демонстрирующего многопоточность для одного процессора
Автор работы: Пользователь скрыл имя, 09 Декабря 2013 в 22:08, курсовая работа
Описание работы
Современные операционные системы (OC) нацелены на наиболее эффективное использование ресурсов компьютера. По большей части эффективность достигается за счет разделения ресурсов компьютера между несколькими процессами. Многопоточность является естественным продолжением многозадачности, точно также как виртуальные машины, позволяющие запускать несколько ОС на одном компьютере, представляют собой логическое развитие концепции разделения ресурсов. В многопоточном приложении одновременно работает несколько потоков. Иногда вместо термина "поток" используется термин "нить". Потоки – это независимые друг от друга задачи, выполняемые в контексте процесса. Поток использует код и данные родительского процесса, но имеет свой собственный уникальный стек и состояние процессора, включающее указатель команд.
Содержание работы
РЕФЕРАТ…………………………………………………….…………
4
СПИСОК СОКРАЩЕНИЙ…………………………………………….
5
СОДЕРЖАНИЕ…………………………………………………………
6
ВВЕДЕНИЕ…………………………………………………………….
7
1 КОНЦЕПЦИЯ МНОГОПОТОЧНОСТИ……………………………
9
2 БИБЛИОТЕКА ПАРАЛЛЕЛЬНЫХ ЗАДАЧ (TPL) ………………..
11
2.1 Основные нововведения TPL……………………………………
11
2.2 Параллелизм данных……………………………………………
17
2.3 Параллелизм задач……………………………………………….
20
2.4 Потенциальные ошибки, связанные с параллелизмом
данных и задач……………………………………………………
21
3 СОЗДАНИЕ МНОГОПОТОЧНОГО ПРИЛОЖЕНИЯ В СРЕДЕ
VISUAL STUDIO.NET………………………………………………
23
3.1 Структурная схема программы …………………………………
23
3.2 Разработка и оптимизация кода программы на C#…………….
25
4 ТЕСТИРОВАНИЕ ПРИЛОЖЕНИЯ………………………………..
30
ЗАКЛЮЧЕНИЕ………………………………………………………..
35
Литература…………………………………………………………
Файлы: 1 файл
Курсяк C#.docx
— 192.86 Кб (Скачать файл)
ЛИТЕРАТУРА
- Net. Сетевое программирование / А. Мунгале, В. Кумар, К. Нагел, Номан Лагари, Т. Паркер, Ш. Шивакумар, Э. Кровчик. М.: Лори, 2007. 416 с.
- Райян Б. Основы разработки приложений на платформе Microsoft .NET Framework. Учебный курс Microsoft / Б. Райян, Т. Нортрап, Ш. Вилдермьюс. СПб.: Питер, 2007. 864 с.
- Байдачный С. .Net Framework 2.0. Секреты создания Windows-приложений / С. Байдачный. М.: Солон, 2006. 520 с.
- Шеферд Д. Программирование на Microsoft Visual C++.NET. Мастер-класс /Д. Шеферд. М.: Русская Редакция, 2005. 928 с.
- Материалы сайта antichat.ru
- Материалы сайта csharpcoding.org
ПРИЛОЖЕНИЕ
Листинг приложения downloader
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Net;
using System.IO;
using System.Diagnostics;
namespace Downloader
{
class Program
{
//очередь адресов для закачки
static Queue<string> URLs = new Queue<string>();
//список скачанных страниц
static List<string> HTMLs = new List<string>();
//локер для очереди адресов
static object URLlocker = new object();
//локер для списка скачанных страниц
static object HTMLlocker = new object();
//очередь ошибок
static Queue<Exception> exceptions = new Queue<Exception>();
static void Main(string[] args)
{
Console.WriteLine("Введите
int s = Convert.ToInt32(Console.
var sw = new Stopwatch();//устанавливаем таймер и запускаем его
sw.Start();
URLs.Enqueue("http://google.
URLs.Enqueue("http://yandex.ru
URLs.Enqueue("http://vorstu.ru
URLs.Enqueue("http://mail.ru")
URLs.Enqueue("http://ru.
URLs.Enqueue("http://really.ru
URLs.Enqueue("http://internat.
URLs.Enqueue("http://
//создаем массив хендлеров, для контроля завершения потоков
ManualResetEvent[] handles = new ManualResetEvent[s];
//создаем и запускаем 3 потока
for (int i = 0; i < s; i++)
{
handles[i] = new ManualResetEvent(false);
(new Thread(new ParameterizedThreadStart(
}
//ожидаем, пока все потоки
WaitHandle.WaitAll(handles);
//проверяем ошибки, если были - выводим
foreach (Exception ex in exceptions)
Console.WriteLine(ex.Message);
//сохраняем закачанные
try
{
for (int i = 0; i < HTMLs.Count; i++)
File.WriteAllText(i + ".html", HTMLs[i]);
Console.WriteLine(HTMLs.Count + " Файлов сохранено");
}
catch (Exception ex) { Console.WriteLine(ex); }
sw.Stop(); //останавливаем таймер
Console.WriteLine("Загрузка завершена за - "+sw.Elapsed.ToString()+" секунд ");
Console.ReadLine();
}
public static void Download(object handle)
{
//будем крутить цикл, пока не закончатся ULR в очереди
while (true)
try
{
string URL;
//блокируем очередь URL и достаем оттуда один адрес
lock (URLlocker)
{
if (URLs.Count == 0)
break; //адресов больше нет, выходим из метода, завершаем поток
else
URL = URLs.Dequeue();
}
Console.WriteLine(URL + " - старт загрузки ...");
//скачиваем страницу
WebRequest request = WebRequest.Create(URL);
HttpWebResponse response = (HttpWebResponse)request.
string HTML = (new StreamReader(response.
//блокируем список скачанных страниц, и заносим туда свою страницу
lock (HTMLlocker)
HTMLs.Add(HTML);
//
Console.WriteLine(URL + " - загружен (" + HTML.Length + " байт)");
}
catch (ThreadAbortException)
{
//это исключение возникает
//просто выходим из цикла, и завершаем выполнение
break;
}
catch (Exception ex)
{
//в процессе работы возникло исключение
//заносим ошибку в очередь ошибок, предварительно залочив ее
lock (exceptions)
exceptions.Enqueue(ex);
//берем следующий URL
continue;
}
//устанавливаем флажок хендла, что бы сообщить главному потоку о том, что мы отработали
((ManualResetEvent)handle).
}
}
}