C # время выполнения метода по нажатию кнопки, не удерживая кнопку нажатой - PullRequest
0 голосов
/ 29 мая 2018

У меня есть опыт разработки программного обеспечения на Python (платформа PyQt с графическим интерфейсом), и я начинаю разработку программного обеспечения на C #.Я хотел знать, как я могу запустить поток / задачу в C #, которая использует объекты пользовательского интерфейса, но поддерживает интерфейс «живым» и не удерживает кнопку нажатой.Я использовал метод «Вызвать» для совместного использования объектов пользовательского интерфейса с потоком / задачей и не вызывал никакого метода соединения, но кнопка все еще оставалась нажатой во время выполнения потока.Есть ли способ запустить этот метод в фоновом режиме, но с поддержкой графического интерфейса пользователя?

Заранее спасибо!


private async void Button_Click(object sender, RoutedEventArgs e)
{
    await Task.Run(new Action(this.Iterate_balance));

}

private async void Iterate_balance()
{
    this.Dispatcher.Invoke(() =>
    {
        // the rest of code
    }
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

ПОПРОБУЙТЕ:

1.Добавьте следующее, используя: using System.ComponentModel;

2.Declare фоновый работник :

private readonly BackgroundWorker worker = new BackgroundWorker();

3.Регистрация событий:

worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;

4. Реализовать два метода:

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
   // run all background tasks here
}

private void worker_RunWorkerCompleted(object sender, 
                                       RunWorkerCompletedEventArgs e)
{
  //update ui once worker complete his work
}

5.Разрешить асинхронизацию работника при необходимости.

worker.RunWorkerAsync();

Также, если вы хотите сообщить о прогрессе процесса, вы должны подписаться на событие ProgressChanged и использовать ReportProgress (Int32) в методе DoWork, чтобы вызвать событие.Также установите следующее: worker.WorkerReportsProgress = true;

Надеюсь, эта помощь.

0 голосов
/ 29 мая 2018

используйте шаблон async / await правильно, и вам вообще не понадобится Dispatcher:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    await Iterate_balance();    
}

private async Task Iterate_balance()
{
    button.Content = "Click to stop";

    // some long async operation
    await Task.Delay(TimeSpan.FromSeconds(4));

    button.Content = "Click to run";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...