Nano Hash - криптовалюты, майнинг, программирование

Как я могу отобразить элемент управления загрузкой, пока процесс ожидает завершения?

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

http://www.codeproject.com/Articles/14841/How-to-write-a-loading-circle-animation-in-NET

Это отлично работает, когда включается и выключается изменение свойства «Активно» на true или false в одном запросе (по одному за раз). Проблема заключается в том, что процесс ожидает обслуживания, и я делаю вид, что активирую loadControl до запуска процесса, и отключаюсь, когда я «думаю», что процесс должен быть завершен. Когда я это делаю, загрузка изображения отображается как статическое изображение. (без анимации).

Извините за этот вопрос, я новичок в C #. Но я думаю, что мне нужно использовать Threads или что-то подобное.

Итак, мой общий код таков:

using [libraries here]...;
namespace [namespace here]
{
    Public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.loadingCircle1.Visible = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(showLoading));
            this.loadingCircle1.Visible = true;
            t.Start();

            //Import an Excel

            t.Abort();
        }

        public void showLoading()
        {
            loadingCircle1.Active = true;
            loadingCircle1.RotationSpeed = 10;
        }
    }
}

Но Всегда Загрузка показывает как статичное изображение без анимации.

18.03.2016

Ответы:


1

Вы создаете поток, который просто устанавливает два свойства, а затем завершается. t.Abort, вероятно, ничего не сделает, поскольку к тому времени поток уже будет закрыт. Хуже того, вы импортируете файл Excel в поток пользовательского интерфейса, который блокирует любую анимацию и замораживает весь пользовательский интерфейс.

Вот как вы должны это сделать:

Примечание: Конечно, если ваша форма адаптивна, вы должны отключить/включить элементы управления и подготовиться к тому, что произойдет, если ваша форма будет закрыта во время загрузки.

<сильный>1. Использование потоков

Если вы действительно хотите явно использовать потоки, сделайте это так:

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

    private Thread workerThread = null;

    private void btnImport_Click(object sender, EventArgs e)
    {
        // start the animation (I used a progress bar, start your circle here)
        progressBar1.Visible = true;
        progressBar1.Style = ProgressBarStyle.Marquee;

        // start the job and the timer, which polls the thread
        btnImport.Enabled = false;
        workerThread = new Thread(LoadExcel);
        workerThread.Start();
        timer1.Interval = 100;
        timer1.Start();
    }

    private void LoadExcel()
    {
        // some work takes 5 sec
        Thread.Sleep(5000);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (workerThread == null)
        {
            timer1.Stop();
            return;
        }

        // still works: exiting
        if (workerThread.IsAlive)
            return;

        // finished
        btnImport.Enabled = true;
        timer1.Stop();
        progressBar1.Visible = false;
        workerThread = null;
    }
}

<сильный>2. Фоновый рабочий

BackgroundWorker может вызвать событие, когда оно будет завершено:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        backgroundWorker1.DoWork += BackgroundWorker1_DoWork;
        backgroundWorker1.RunWorkerCompleted += BackgroundWorker1_RunWorkerCompleted;
    }


    private void btnImport_Click(object sender, EventArgs e)
    {
        // start the animation
        progressBar1.Visible = true;
        progressBar1.Style = ProgressBarStyle.Marquee;

        // start the job
        btnImport.Enabled = false;
        backgroundWorker1.RunWorkerAsync();
    }

    private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        LoadExcel();
    }

    private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        btnImport.Enabled = true;
        progressBar1.Visible = false;
    }

    private void LoadExcel()
    {
        // some work takes 5 sec
        Thread.Sleep(5000);
    }
}

<сильный>3. Использование асинхронного ожидания

Это самый простой.

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

    private async void btnImport_Click(object sender, EventArgs e)
    {
        // start the waiting animation
        progressBar1.Visible = true;
        progressBar1.Style = ProgressBarStyle.Marquee;

        // simply start and await the loading task
        btnImport.Enabled = false;
        await Task.Run(() => LoadExcel());

        // re-enable things
        btnImport.Enabled = true;
        progressBar1.Visible = false;
    }

    private void LoadExcel()
    {
        // some work takes 5 sec
        Thread.Sleep(5000);
    }
}
18.03.2016
  • Отличное объяснение, спасибо, @taffer. 20.03.2016

  • 2

    Я бы рекомендовал использовать async/await (для С# 5.0):

    private void button1_Click(object sender, EventArgs e){
        ImportAsync();
    }
    
    private async Task ImportAsync(){
        // UI-thread
        showLoading();
        this.loadingCircle1.Visible = true;
    
        // wait until task will be finished
        await Task.Run(() => {
            // different non-blocking thread for all the hard work, but without UI-stuff
            // import an Excel
        });
    
        // going back to UI-thread
        this.loadingCircle1.Visible = false;
    }
    
    18.03.2016
  • разве вы не должны сделать обработчик событий асинхронным недействительным и ожидающим ImportAsync? 18.03.2016
  • Оба способа должны работать, и я думаю, что у обоих есть свои преимущества. 18.03.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..