chinu1d Ответов: 2

Как использовать индикатор выполнения в C#


У меня есть проект приложения windows form со мной.
У меня есть кнопка отправки. И в его методе есть длинный код.
Я хочу, чтобы при нажатии на кнопку отправки индикатор выполнения начинался и заканчивался, когда код в методе кнопки будет полностью завершен.

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

я попробовал использовать таймер и запустил таймер в методе star of button
и увеличил индикатор выполнения на 1 в методе timer_click.
но индикатор прогресса застрял в старте.

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

Ralf Meier

Вы должны показать нам код, где вы пытались сделать это с помощью таймера.
Не видя никакого кода, я не могу дать вам никакого совета ...

sameer549

с какой проблемой вы сталкиваетесь с фоновым работником ??
Я делал много таких длительных задач, используя background worker.
проверьте простой пример с фоновым работником и попробуйте его реализовать.
https://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

Gabriel Szabo

Элементы управления пользовательского интерфейса не обновляются, поскольку ваш долго работающий метод блокирует насос событий приложения. Быстрая (но грязный) решением является вызов метода Refresh() на прогресс-бар, после продвижения (например, после PerformStep()). Вы также можете позвонить в приложение.DoEvents (), который будет обрабатывать все события в очереди. Фоновый работник - это самое чистое решение.

2 Ответов

Рейтинг:
2

RickZeeland

Я тоже столкнулся с этой проблемой, когда начинал с WPF, вам, вероятно, нужно что-то вроде этого:

progressbar1.Dispatcher.Invoke(() => progressbar1.Value = i, DispatcherPriority.Background);
Видеть: c# - обновление индикатора выполнения в режиме реального времени в wpf - переполнение стека[^]


Рейтинг:
2

TheRealSteveJudge

Пожалуйста, взгляните на этот пример:

Файл MainWindow.язык XAML

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ProgressBar Name="ProgressBar" Height="20"></ProgressBar>
    </Grid>
</Window>

Файл MainWindow.язык XAML.в CS
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApplication3
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            ProgressBar.Minimum = 0;
            ProgressBar.Maximum = 100;
            ProgressBar.Value = 0;

            DoIt();
        }

        public void DoIt()
        {
            var task = new Task(() =>
            {
                for (var i = 0; i <= 100; i++)
                {
                    SetProgressBarValue(i);

                    // Simulate some work...
                    Thread.Sleep(100);
                }
            });

            task.Start();
        }

        public void SetProgressBarValue(int value)
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                ProgressBar.Value = value;
            });
        }
    }
}