单击按钮时的C#运行时耗尽方法,无需按住按钮

时间:2018-05-29 07:25:59

标签: c# wpf multithreading

我有使用Python开发软件(GUI平台PyQt)的经验,我正在学习C#中的软件开发。我想知道如何在C#中运行一个使用UI对象的线程/任务,但保持UI" alive"而不是按住按钮。我曾经使用过" Invoke"用线程/任务共享UI对象的方法并没有调用任何连接方法,但在线程执行期间仍然按下按钮。有没有办法在后台运行此方法,但保持GUI响应?

提前致谢!

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 :(得分:3)

正确使用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";
}

答案 1 :(得分:1)

尝试:

1.使用以下内容添加以下内容:using System.ComponentModel;

2.Declare background worker

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事件并在DoWork方法中使用ReportProgress(Int32)来引发事件。还设置如下:worker.WorkerReportsProgress = true;

希望得到这个帮助。