Clodetta del Mar Ответов: 2

Задачи C#, ожидание и асинхронность


Здравствуйте, общий СР.
я готовлюсь к "программированию MSCSD 70-483 на C#", и в этом контексте я недавно немного узнал о задачах, await и async, поэтому я абсолютно новичок в этой теме.
Я хотел бы знать, правильно ли я понял основную концепцию или нет.
В качестве упражнения я написал небольшую программу резервного копирования, которая копирует файлы и папки из исходного пути в конечный путь. Ничего сложного, просто разобраться, в чем преимущества, а в чем минусы, вернее то, что он не может выполнить.
После процесса копирования я регистрирую некоторые данные в базе данных. я хочу, чтобы эти два шага обрабатывались последовательно.

Для меня конечные преимущества заключаются в управлении потоком программы, принятии решения о том, следует ли ее обрабатывать параллельно или нет, и управлении "использованием потоков".

Для удобства я выбрал "олдскульный" WinForm-проект в VS2019 году.
Мой вопрос таков:
Правильно ли я понимаю, что эта концепция не используется для обеспечения отзывчивости пользовательского интерфейса?
Если я хочу достичь этого, мне все равно нужно использовать фонового работника, не так ли?
Я немного запутался, поэтому любая ваша помощь в просвещении меня очень ценится. :-)
Заранее спасибо,
с уважением :-)
Клодетта

Что я уже пробовал:

я узнал кое-что о задачах, ожидании и асинхронности и не совсем уверен, правильно ли я это понял ...

2 Ответов

Рейтинг:
2

Clodetta del Mar

- Привет, Ричард.
Спасибо Вам за ваш ответ!


Это прекрасно объясняет, почему мое приложение зависает до тех пор, пока оно копирует файлы и папки, и почему я не вижу никаких эффектов на пользовательском интерфейсе, хотя я использую

Task.Run
.

Еще раз благодарю вас за помощь.
*недурно*
:-)


Рейтинг:
15

Richard Deeming

Цитата:
Правильно ли я понимаю, что эта концепция не используется для обеспечения отзывчивости пользовательского интерфейса?
Нет - async / await он отлично подходит для обеспечения отзывчивости пользовательского интерфейса, если используется правильно.

Вещи, которые привязаны к процессору или работают синхронно, все еще могут вызывать проблемы. Например: вызов Thread.Sleep на потоке пользовательского интерфейса будет заморожен пользовательский интерфейс. Но обычно есть альтернативы, которые будут держать пользовательский интерфейс отзывчивым - например: использование Task.Delay вместо Thread.Sleep А если все остальное не удается, вы можете поместить привязанный к процессору код в фоновый поток с помощью Task.Run.

К сожалению, System.IO классы не предоставляют асинхронных методов для перечисления или копирования файлов, поэтому вы вряд ли увидите какую-либо выгоду от этого async в этом случае.