Если вы хотите реагировать на UI и запускать длительную рабочую нагрузку ЦП (а не масштабируемость как таковую), тогда это нормально и добьется того, чего вы хотите.По сути это будет
- Создать новый поток (термин используется свободно)
- Создать продолжение
- Вернуть поток, который его вызывает (в вашем случае поток пользовательского интерфейса)
- Выполнить рабочую нагрузку
- Запустить продолжение
- 5a Выполнить все после
await
в потоке, который вы вызвали
Хотя Задачи не являются потоками, вы обнаружите, что они украдут поток из Пулов потоков , чтобы выполнить вашу рабочую нагрузку, и освободят Пользовательский интерфейс до его завершения
Вы также можете сделать то же самое со старым стилем Task.Run
и ContinueWith
.
Также существует другая школа мысли, что есливы используете TaskFactory.StartNew
с TaskCreationOptions
как LongRunning
, это намекает на значение по умолчанию TaskScheduler
, что вы хотите создать поток, внешний по отношению к Пулу потоков .Это дает преимущество, оставляя Thread Pool с большим количеством ресурсов.
Говоря о том, что TaskFactory.StartNew
- великий папа Task методов создания, он имеетего собственные причуды, и вы, вероятно, должны использовать его, только когда вы чувствуете необходимость сделать это.Я бы просто придерживался того, что у вас есть.
Последнее примечание, хотя кажется хорошей идеей обернуть эту рабочую нагрузку в метод и назвать ее async
, как правило, это не очень хорошая идея;и если вы должны обернуть, лучше всего позвонить решать эти вещи.Итак, еще раз вы делаете правильные вещи. Стивен Клири рассказывает о Fake Async
и Async Wrappers
и причинах, по которым вам не нужно делать это в
Task.Run Этикет и правильное использование