为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕姐4208626 2021-06-29 12:12:06
我确实有使用 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    }}
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

试试这个:


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;


希望这有帮助。


查看完整回答
反对 回复 2021-07-10
?
DIEA

TA贡献1820条经验 获得超2个赞

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

}


查看完整回答
反对 回复 2021-07-10
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信