Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
FerroDS
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
#1

Принцип и описание работы потоков - C#/.NET 4.x

27.02.2014, 19:38. Просмотров 920. Ответов 11
Метки нет (Все метки)

Какие вообще существуют асинхронные потоки?

Я знаю следующие:
PLINQ,ThreadPool,Task.

http://www.cyberforum.ru/csharp-beginners/thread1850297.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2014, 19:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос .NET 4.x Принцип и описание работы потоков (C#):

Принцип работы Dictionary
Всем привет. В двух словах, я пытался оценить скорость работы встроенного...

Принцип работы SkipWhile
Объясните пожалуйста) у меня задание "В одномерном массиве, состоящем из и...

Принцип работы со структурами
Доброго вечера Помогите, пожалуйста, разобраться со структурами на C# Вот...

Основы C# принцип работы
Гении помогите !!??Я только учусь, объясните принцип работы С# ?

Правильный принцип работы программы
Хотелось бы узнать как правильным будет построить программу Есть обычный...

11
insite2012
Модератор
Эксперт .NET
4788 / 3747 / 1081
Регистрация: 12.10.2013
Сообщений: 10,986
Записей в блоге: 2
27.02.2014, 22:40 #2
Потоки - это просто потоки, а какие они - зависит от того, как Вы их запустите, синхронно или асинхронно.
1
Martovskij
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
Завершенные тесты: 4
27.02.2014, 22:52 #3
Цитата Сообщение от FerroDS Посмотреть сообщение
Я знаю следующие:
PLINQ,ThreadPool,Task.
Начал писать, понял что будет много и забил))
PLINQ,ThreadPool и Task - это все разные вещи. Вам необходимо подтянуть базис по многопоточному программированию и повторить вопрос.
Короче программный поток - это последовательное исполнение кода программы, 10 - потоков - 10 одновременно исполняющихся участков кода программы. Нет вообще таких понятий синхронный/асинхронный поток, есть понятие синхронное/асинхронное действие, например вам необходимо отправить файл Васе, вы может делать это синхронно - из того потока, в котором работаете или асинхронно - поручить это дело другому потоку а самому идти дальше.
1
Водяной Змей
Заблокирован
27.02.2014, 23:22 #4
Все потоки асинхронные.
Это особо заметно, когда их больше, чем ядер у ЦП.
Из-за их асинхронности на многозадачной ОС очень сложно создать точный микросекундный таймер.
1
tezaurismosis
Администратор
Эксперт .NET
8260 / 3764 / 721
Регистрация: 17.04.2012
Сообщений: 8,442
Записей в блоге: 14
28.02.2014, 10:31 #5
Книг, в подробностях описывающих работу с потоками в .NET полнО, начиная с CLR via C# и заканчивая
.NET Multithreading (Alan Dennis)
Multithreading in C# 5.0 Cookbook (Eugene Agafonov)
Pro .NET 4 Parallel Programming in C# (Adam Freeman)
Concurrent Programming on Windows (Joe Duffy)
и т.д.
Я думаю, по объёму этих книг легко понять, что в двух словах в сообщении ответ на ваш вопрос не напишешь.
1
FerroDS
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
28.02.2014, 21:23  [ТС] #6
Martovskij, можете тогда объяснить их различия?

Добавлено через 2 часа 42 минуты
Какие потоки по Вашему мнению работают быстрее?(т.е. стартуют)
И какие работают лучше при большом кол-во потоков?
0
Водяной Змей
Заблокирован
28.02.2014, 21:37 #7
Изучайте WinAPI.
Все потоки под виндой реализованы через CreateThread() или SetTimer(), поэтому принципиальной разницы между ними нет.

Переключением потоков занимается винда, а не CLR (.NET).
1
Martovskij
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
Завершенные тесты: 4
01.03.2014, 10:47 #8
Цитата Сообщение от FerroDS Посмотреть сообщение
можете тогда объяснить их различия?
PLINQ - это механизм параллельных запросов.
Допустим у вас есть List<T>, в этом листе хранится 100000 элементов, вам необходимо найти определенные элементы, пока вы поочереди (в одном потоке) будете перебирать все 100000 элементов, уйдет немало времени. Можно перебрать эти 100000 элементов например из 10 потоков с помощью PLINQ, это уменьшит время поиска в некоторое число раз.

Thread - это тот самый поток, из-за которого вся свистопляска. Thread'ов может быть 1 в программе, а может быть 100. Ваше ПО не может создать 100000000 потоков, у платформы для каждого процесса есть ограничение на количество потоков, если вы захотите использовать больше, чем вам позволено, вы получите OutOfMemoryException (потому как невозможно выделить память для нового потока).
Тогда возникает вопрос, а что если вашему процессу необходимо раз в секунду выполнять что то асинхронно? каждый раз создавать новый поток? тогда вы быстро упретесь в ограничение на количество потоков и в очередной раз при создании потока получите тот самый OutOfMemoryException. Как же тогда быть?
Для решения этой проблемы есть контейнер потоков ThreadPool, который позволяет переиспользовать уже созданные потоки. Поток, контекст которого завершился (допустим контекст - отправка файла на почту) может быть использовать для другого контекста.
Task<> - это уже высокоуровневая абстракция для выполнения асинхронных действии, после того, как вы создали таск и сказали, что он должен делать (отслеживать изменения файла допустим), таск запустится не в отдельном потоке (как обычный Thread, или Thread из ThreadPool), а будет выполнятся то в одном потоке, то в другом потоке (где есть свободное место для выполнения), поэтому не удивляйтесь если после вызова метода Task().Start() он запустится через 5 секунд после этого.Работой Task занимается CLR и пока об этом не думайте.

Добавлено через 7 минут
Ах да, еще забыл, есть понятие процесса. процесс аналогичен потоку, только вот является более крупномасштабной сущностью
Допустим есть процесс Notepad.exe, допустим в этом процессе выполняется 10 потоков, тогда картинка будет следующая

----Notepad.exe
|
|------------- Thread 0 <-----|
|------------- Thread 2 <-----| Task'и могут выполнятся в любом из этих потоков
|------------- Thread 3 <-----|
....
|------------- Thread 9 <-----|
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
01.03.2014, 12:06 #9
FerroDS, потоки Thread основаны на виндовых потоках. ThreadPool основан на потоках Thread. Task основан на ThreadPool. PLINQ основан на Task. Дальнейшее развитие - async/await, тоже основано на Task, но позволяет намного больше спрятать под капот.


Вопрос: как что-то из этого может быть лучше, если все это одно и то же?..
1
Martovskij
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
Завершенные тесты: 4
01.03.2014, 12:55 #10
Точно! Вот теперь все последовательно!
0
FerroDS
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
04.03.2014, 20:44  [ТС] #11
Тогда async/await получается лучше всех?
0
Водяной Змей
Заблокирован
04.03.2014, 20:51 #12
Попробуйте на практике все варианты - увидите какой для чего лучше подходит.
1
04.03.2014, 20:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 20:51
Привет! Вот еще темы с решениями:

Принцип работы акцессоров get и set
public class Link { public int Id { get; set; } public string Url {...

Regex. Принцип эффективной работы
Вопрос кратко: что делать для эффективной работы Regex, если к одной и той же...

Объснить принцип работы кода
Добрый день. В универе с ребятами делала проектную работу,но толком не...

Каков принцип работы атрибутов
Всем доброго времени суток. Объясните пожалуйста принцип работы атрибутов. То...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru