C#在不按住按钮的情况下单击按钮运行耗时的方法

我确实有使用 Python(GUI 平台 PyQt)进行软件开发的经验,并且正在学习使用 C# 进行软件开发。我想知道如何在 C# 中运行一个线程/任务,它使用 UI 对象但保持 UI“活动”而不是保持按下按钮。我确实使用“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

    }

}


慕姐4208626
浏览 162回答 2
2回答

人到中年有点甜

试试这个:1.添加以下使用: using System.ComponentModel;2.声明后台工作者: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 async。worker.RunWorkerAsync();此外,如果您想报告流程进度,您应该订阅 ProgressChanged 事件并在 DoWork 方法中使用 ReportProgress(Int32) 来引发事件。还设置如下:worker.WorkerReportsProgress = true;希望这有帮助。

DIEA

正确使用 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";}
打开App,查看更多内容
随时随地看视频慕课网APP