async и progressbar
Цитата: Илья от 08.02.2024, 17:58Всех приветствую. Который день ломаю голову над следующей проблемой.
Есть задача: перебрать большое количество данных, предположим 500000 строк. Соответственно, логично было бы это сделать отдельным таском. Но при этом, есть необходимость весь процесс как-то визуализировать, что бы пользователь понимал на каком этапе находится обработка. Для этого дела, если я правильно понимаю, существует такая вещь как IProgress. В итоге имеем вот такой незамысловатый код:
private async Task HardTask(int count, IProgress<int> progress) { await Task.Run(() => { for (int i = 0; i < count; i++) { var percent = (i * 100) / count; progress.Report(percent); } }); } private async void Button_Click(object sender, EventArgs e) { var progress = new Progress<int>(value => { progressBar1.Value = value; }); Task.Run(() => HardTask(500000, progress)); }И все бы хорошо, прогрессбар отлично отображает процесс выполнения длительной задачи, но как всегда есть огромное НО! Не смотря на то, что запускается задача в отдельном потоке, весь интерфейс умирает и окно программы висит, пока не завершится задача.
Подскажите, как решить данную проблему? Каким образом можно выполнять тяжелые и длительные задачи в фоне, что бы параллельно спокойно продолжать работать с окном программы? Уже всю голову себе сломал. По факту получается, что вся асинхронность работает до поры до времени, пока ты не подкинешь серьезную задачу. Как только задача более менее тяжелая, то абсолютно не важно в каком потоке она выполняется, интерфейс упорно "висит", будто бы ждет по await.
Всех приветствую. Который день ломаю голову над следующей проблемой.
Есть задача: перебрать большое количество данных, предположим 500000 строк. Соответственно, логично было бы это сделать отдельным таском. Но при этом, есть необходимость весь процесс как-то визуализировать, что бы пользователь понимал на каком этапе находится обработка. Для этого дела, если я правильно понимаю, существует такая вещь как IProgress. В итоге имеем вот такой незамысловатый код:
private async Task HardTask(int count, IProgress<int> progress)
{
await Task.Run(() =>
{
for (int i = 0; i < count; i++)
{
var percent = (i * 100) / count;
progress.Report(percent);
}
});
}
private async void Button_Click(object sender, EventArgs e)
{
var progress = new Progress<int>(value =>
{
progressBar1.Value = value;
});
Task.Run(() => HardTask(500000, progress));
}
И все бы хорошо, прогрессбар отлично отображает процесс выполнения длительной задачи, но как всегда есть огромное НО! Не смотря на то, что запускается задача в отдельном потоке, весь интерфейс умирает и окно программы висит, пока не завершится задача.
Подскажите, как решить данную проблему? Каким образом можно выполнять тяжелые и длительные задачи в фоне, что бы параллельно спокойно продолжать работать с окном программы? Уже всю голову себе сломал. По факту получается, что вся асинхронность работает до поры до времени, пока ты не подкинешь серьезную задачу. Как только задача более менее тяжелая, то абсолютно не важно в каком потоке она выполняется, интерфейс упорно "висит", будто бы ждет по await.
Цитата: Илья от 08.02.2024, 19:42Тема не актуальна, дошло наконец в чем косяк 🙂
Тема не актуальна, дошло наконец в чем косяк 🙂
Цитата: Adler от 08.02.2024, 19:43Цитата: Илья от 08.02.2024, 19:42Тема не актуальна, дошло наконец в чем косяк 🙂
Приветствую.
Если вы самостоятельно нашли решение, то сами себе и ответьте, в чем была ошибка, вероятно это еще кому-то поможет найти свою ошибку.
Цитата: Илья от 08.02.2024, 19:42Тема не актуальна, дошло наконец в чем косяк 🙂
Приветствую.
Если вы самостоятельно нашли решение, то сами себе и ответьте, в чем была ошибка, вероятно это еще кому-то поможет найти свою ошибку.