Я просто пытался выяснить, как я использую объект Task, чтобы время от времени выполнялось в отдельном канале. Но интересно, Task(()=>{...})
похоже на создание new Thread(new ThreadStart(()=>{....}))
?Выполняет ли каждый новый System.Threading.Tasks.Task() новый поток?
ответ
Короткий ответ: Нет. Задачи выполняются через пул потоков. Вот блог об этом: Threads vs. Tasks: Задача не создает свой собственный поток ОС. Вместо этого задачи выполняются TaskScheduler; планировщик по умолчанию просто запускается на ThreadPool
косвенно вы хотите сказать, когда я создаю новую задачу его создания экземпляра/создать/загрузить новый поток из пула потоков ?? – BreakHead
@BreakHead Нет, ThreadPool может повторно использовать потоки. – BartoszKP
@BreakHead Если в потоковом потоке имеется простаивающий поток, он будет использовать этот поток. Если в потоковом потоке нет простаивающих потоков, будет создан новый поток. Когда в потоковом потоке простаивают несколько потоков, некоторые из них будут остановлены. (Это несколько упрощает, но вы поняли эту идею.) –
A Task
представляет собой обещание работ, которые будут выполнены в будущем.
Есть несколько вариантов, как Task
получает создано:
Task.Run
Использование илиTask.Factory.StartNew
без флагов - Это будет очередь работать на .NET ThreadPool, как указано.Использование
Task.Factory.StartNew
с указаниемTaskCreationOptions.LongRunning
- Это будет сигнализироватьTaskScheduler
, чтобы использовать новый поток вместо потока ThreadPool.При использовании функции
async-await
C# -5, также известной какPromise Tasks
. Когда выawait
по методе возвращающейTask
илиTask<T>
, они не могут использовать любой механизм многопоточности, либо ThreadPool илиnew Thread
делать свою работу, как они могут использовать чисто асинхронный API, то есть они будут продолжать выполнять на резьбе который выполнил их и вернет управление методу вызова после первого ключевого словаawait
.Благодаря Servy для этого. Другими вариантами исполнения является создание настраиваемого
TaskScheduler
и передача его вTask.Factory.StartNew
. ОбычайTaskScheduler
даст вам точный контроль над исполнением вашегоTask
Всех этих вариантов приходят, чтобы показать, что Task
просто обещание, и есть много форм, в которых вы можете выполнить это обещание. Поток - это средство для конца, а Task
- это единица работы, которую мы хотим сделать.
К вашему пункту № 3 действительно есть задачи, которые могут быть созданы, которые представляют это, но они не создаются с помощью 'await'. Любой код, следующий за 'await', - это код, выполняемый где-то в некотором фактическом потоке. 'await' - это просто инструмент, который позволяет запускать некоторый код при завершении задачи; ожидаемая * задача * может или не может включать использование фактического потока. Существуют и другие варианты, кроме 1 и 2 при использовании 'Run' для дальнейших настроек. – Servy
@Servy Я отредактировал пункт 3, чтобы дать понять, что я могу сказать. Что касается дальнейших вариантов, позаботьтесь о том, что я пропустил? –
Вы пропустили персонализированный планировщик задач – Servy
Возможно. Это зависит.
По умолчанию
Task
объектов, созданные с помощьюTask.Run
,Task.Factory.StartNew
, или с помощьюTask
конструктора, будут использовать по умолчаниюTaskSchedluer
, который будет планировать делегат для запуска в пуле потоков.Нестандартный
TaskScheduler
может использоваться для планирования задачи для выполнения в любом потоке, который вы определяете с помощью этого планировщика. Вы можете определить его для запуска в потоке пользовательского интерфейса, в его собственном новом потоке, в пуле потоков, кроме пула потоков .NET, совсем не так, или что-то еще, что вы хотите.Вы можете создать
Task
с помощьюTaskCompletionSource
, в котором нет необходимости в существовании нити.Task
даже не нужно представлять заполнение делегата. Он может представлять любую операцию, которая заканчивается в будущем, возможно, с результатом. Это может включать некоторый код, выполняющийся в потоке, или он может представлять собой асинхронную операцию, такую как IO, поведение пользователя, запуск события, состав различных других задач или что-либо еще, что вы хотите создать.
- 1. Выполняет ли каждый запрос RMI новый поток на стороне сервера?
- 2. какой поток выполняет новый поток видит как 'parent'
- 3. Task.WhenAll() - создает ли новый поток?
- 4. Использует ли Stream.parallel() новый поток?
- 5. C++ новый поток спит основной поток
- 6. Использует ли использование async/await новый поток?
- 7. OAuth: новый входной поток?
- 8. Будущее всегда создает новый поток?
- 9. C# - новый поток форума
- 10. выполняет вызов функции java, порождает новый поток для его выполнения?
- 11. Новый массив Каждый итерацию
- 12. Оптимизируйте новый BufferedReader (входной поток)
- 13. Erlang - перечислить каждый процесс «erlang» в новый поток ядра
- 14. Создает ли handler.post (runnable) новый поток?
- 15. Создает ли C# AsyncCallback новый поток?
- 16. Можно ли создать новый поток в цикле?
- 17. Создает ли новый рабочий поток? Create_workqueue()?
- 18. Существует ли новый поток, когда pthread_create() возвращается?
- 19. Будет ли request.getRequestDispatcher() форвардом создать новый поток?
- 20. При перезагрузке Loader он создает новый поток каждый раз
- 21. Новый поток при вызове timer_create()
- 22. Передать каждый элемент списка в новый поток по порядку
- 23. Когда мы создаем и запускаем новый поток .NET, создает ли новый поток уровня ОС?
- 24. Новый поток внутри замка - C#
- 25. Почему новый поток вместо будущего {...}
- 26. Когда ASP.NET убьет новый поток?
- 27. Новый экземпляр объекта каждый вызов
- 28. Как сохранить каждый новый объект?
- 29. ASP.NET Postback создает новый поток и новый сеанс
- 30. WCF - начиная новый поток асинхронен
Задачи использует ThreadPool, не поточно – Rangesh