首页 > 解决方案 > C# 在不按住按钮的情况下单击按钮时运行耗时的方法

问题描述

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

标签: c#wpfmultithreading

解决方案


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

推荐阅读