Member 13406242 Ответов: 1

Как отобразить индикатор выполнения ожидания или " обработка.... "


Пожалуйста, объясните мне это, я хочу сделать какой-то процесс, показывая ожидающий индикатор выполнения, но я не понимаю, где и как это сделать? Пожалуйста, дайте мне знать, как на самом деле работает следующий код, чтобы я мог его реализовать.

я хочу отобразить ожидающее сообщение для использования, если только необходимый процесс не был завершен.

в приведенном ниже коде я создал две формы, первая форма как некоторая фиктивная обработка данных, а другая форма содержит только метку и индикатор выполнения. когда я нажимаю кнопку на первой форме, вторая форма появляется в виде ожидающего диалогового окна. он работает правильно, но я просто хочу знать, как работает приведенный ниже код, чтобы я мог изменить его для своей цели.

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

public Form1()
        {
            InitializeComponent();
        }
        void SaveData()
        {
            for (int i = 0; i <= 5; i++)
            {
               // Thread.Sleep(500);// simulator
            }
            
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            using (Waitform objWaitForm = new Waitform(SaveData))
            {
                objWaitForm.ShowDialog(this);
            }
        }

//End From1///

 public Action Worker { get; set; }
        public Waitform(Action worker)
        {
            InitializeComponent();
            if (worker == null)
                throw new ArgumentNullException();
            Worker = worker;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Task.Factory.StartNew(Worker).ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
        }

///End Waitform//

Richard MacCutchan

И каков был результат, когда вы попробовали? Кроме того, вы рассматривали Класс ProgressBar (System.Окна.Формы)[^]?

1 Ответов

Рейтинг:
0

Graeme_Grant

Если вы рассматриваете использование задач для асинхронных операций, вот пример того, как это сделать.

1. Форма Прогресса. Имеет метку для предоставления сообщений о ходе выполнения - вы можете поменять ее на индикатор выполнения. Code-behind для обработки обновлений:

public partial class ProgressForm: Form
{
    public ProgressForm()
    {
        InitializeComponent();
    }

    public void SetMessage(string text)
    {
        labMessage.Text = text;
    }
}

2. вызывающая форма с длительно выполняемой задачей:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        ShowProgressWindow();

        await UnitOfWork().ConfigureAwait(false);

        CloseProgressWindow();

    }

    private void CloseProgressWindow()
    {
        if (InvokeRequired)
        {
            Invoke((MethodInvoker)(CloseProgressWindow));
        }
        else
        {
            progress.Hide();
            button1.Enabled = true;
        }
    }

    private void ShowProgressWindow()
    {
        // disable button at start of process
        button1.Enabled = false;
        progress.Show(this);
    }

    private readonly ProgressForm progress = new ProgressForm();

    private readonly List<string> UpdateMessages = new List<string>
    {
        "Loading the fodder",
        "Watering the seeds",
        "Feeding the goats",
        "Clipping the flowers",
        "Smelling the roses",
        "Closing the doors",
        "Saving the changes",
        "Done!"
    };

    private Task<bool> UnitOfWork()
    {
        var tcs = new TaskCompletionSource<bool>();

        Task.Run(async () =>
        {
            for (int i = 0; i < 8; i++)
            {
                ProgressUpdate(UpdateMessages[i]);
                // Do long running synchronous work here...
                await Task.Delay(1000).ConfigureAwait(false); // simulate a 1 second task
            }

            // signal success!
            tcs.SetResult(true);

        }).ConfigureAwait(false);

        return tcs.Task;
    }

    private void ProgressUpdate(string updateMessage)
    {
        if (InvokeRequired)
            Invoke((MethodInvoker)(() => ProgressUpdate(updateMessage)));
        else
            progress.SetMessage(updateMessage);
    }
}


Member 13406242

Большое спасибо позвольте мне попробовать

Graeme_Grant

Добро пожаловать. :)

Member 13406242

Дорогие друзья! пожалуйста, не возражайте еще кое о чем спросить!

в приведенном ниже коде, когда я хочу использовать любой элемент управления form1 (например, txtName. text= "abc"), он ни выбрасывает исключение, ни выдает некоторые ошибки, но приложение простаивает. но скорее, когда я хочу какой-то другой процесс, он работает.


частная задача<bool & gt; UnitOfWork()
{
var tcs = new TaskCompletionSource<bool>();
пробовать
{
Задач.Запустить ((асинхронный) =&ГТ;
{
for (int i = 0; i < 8; i++)
{
ProgressUpdate(UpdateMessages[i]);

это то самое место, о котором я беспокоюсь.

жду задания.Задержка (1000).ConfigureAwait (false); / / имитация 1-секундной задачи
}

// сигнал успеха!
ТКС.SetResult(правда);

}).ConfigureAwait(false);

вернуться ТКС.Задача;
}
catch (исключение)
{
бросать;

}

}

Graeme_Grant

Всегда убедитесь, что вы обновляете элементы управления пользовательского интерфейса в потоке пользовательского интерфейса. Я делаю это внутри ?ProgressUpdate метод.